To calculate the allele frequencies, I began with the bcf output from mega-post-bcf-exploratory-snakeflow so that the data has gone through all our normal filtering steps. The basic steps are to get the genotype likelihoods, convert the bcf to a vcf and subset by population, and then calculate the allele frequencies using angsd.

mamba activate bcftools1.15 #load in bcftools environment
bcftools +tag2tag main.bcf -- -r -PL-to-GL > genolikes.bcf # converts the FORMAT/PL source tag to FORMAT/GL, since angsd needs the tag
bcftools view genolikes.bcf -S sample_subset.txt -O v -o subset_genolikes.vcf # given the list of samples, subsets and saves as a vcf
angsd -vcf-gl subset_genolikes.vcf -fai genome.fasta.fai -nind 10 -domaf 3 -out angsd_outputs/subset # angsd calculates the minor allele frequencies based on an assumed known major and minor allele but takes the uncertainty of the minor allele into account (-domaf 3) and the number of individuals in changed based on how many you have (this can be grabbed with a quick wc -l)

Now we use the .mafs.gz outputs of angsd for our plots. What makes these version 2 is that the first time I calculated allele frequencies with the corrected metadata (and thus the larger Mid-Atlantic group), I did it from the mega-non-model-wgs-snakeflow bcf (which is filtered less).

In Eric’s example, he filtered by 30 for 64 individuals, so you can play with how heavily you want to filter the data. For this, I prefer 70-85% and typically choose 80% and always round down. Having a higher number of individuals have information at that region makes me more sure of the results, but it might be reasonable to start at 50% or so just to check it out before stricter filtering.

Now, we do the comparisons:

natla_mida <- inner_join(natla_freqs, 
                         mida_freqs, 
                         by = c("chromo", "position"), 
                         suffix = c("_n", "_m")) %>% # joins together the northern and mid-atlantic allele frequencies by the chromosome and position, keeping the observations that match and keeps the calculated values separate
  mutate(ave_freq = (unknownEM_n + unknownEM_m) / 2, # the average frequency from -domaf 3
         abs_diff = abs(unknownEM_n - unknownEM_m)) # the absolute difference in those frequencies

natla_grtl <- inner_join(natla_freqs, 
                         grtl_freqs, 
                         by = c("chromo", "position"), 
                         suffix = c("_n", "_g")) %>%
  mutate(ave_freq = (unknownEM_n + unknownEM_g) / 2, 
         abs_diff = abs(unknownEM_n - unknownEM_g))

mida_grtl <- inner_join(mida_freqs, 
                        grtl_freqs, 
                        by = c("chromo", "position"), 
                        suffix = c("_m", "_g")) %>%
  mutate(ave_freq = (unknownEM_m + unknownEM_g) / 2, 
         abs_diff = abs(unknownEM_m - unknownEM_g))

natla_finl <- inner_join(natla_freqs, 
                         finl_freqs, 
                         by = c("chromo", "position"), 
                         suffix = c("_n", "_f")) %>%
  mutate(ave_freq = (unknownEM_n + unknownEM_f) / 2,
         abs_diff = abs(unknownEM_n - unknownEM_f))
mida_finl <- inner_join(mida_freqs, 
                         finl_freqs, 
                         by = c("chromo", "position"), 
                         suffix = c("_m", "_f")) %>%
  mutate(ave_freq = (unknownEM_m + unknownEM_f) / 2,
         abs_diff = abs(unknownEM_m - unknownEM_f))

Now I’m going to check the distribution of our data to make plotting it easier, and pick a cutoff that will retain most of the information.

nxm_check <- ggplot(data = natla_mida, 
                    mapping = aes(x = ave_freq,
                                  y = abs_diff)) +
  geom_hex(binwidth = 0.001) +
  scale_fill_viridis_c()
nxm_check

nxg_check <- ggplot(data = natla_grtl, 
                    mapping = aes(ave_freq, 
                                  y = abs_diff)) +
  geom_hex(binwidth = 0.001) +
  scale_fill_viridis_c()
nxg_check

mxg_check <- ggplot(mida_grtl, 
                    mapping = aes(x = ave_freq,
                                  y = abs_diff)) +
  geom_hex(binwidth = 0.001) +
  scale_fill_viridis_c()
mxg_check

nxf_check <- ggplot(natla_finl, 
                    mapping = aes(x = ave_freq, 
                                  y = abs_diff)) +
  geom_hex(binwidth = 0.001) +
  scale_fill_viridis_c()
nxf_check

mxf_check <- ggplot(mida_finl, 
                    mapping = aes(x = ave_freq, 
                                  y = abs_diff)) +
  geom_hex(binwidth = 0.001) +
  scale_fill_viridis_c()
mxf_check

I want to try to keep this in the same range as a 50,000 size sliding window, so I’m going to filter my data for an absolute difference greater than 0.15

Then I set up the data for plotting by getting the center position of each chromosome, so that the labels are centered on each chromosome and not repeated.

Finally, I plot the absolute differences of the allele frequencies across the entire genome, focusing on the sections that the pairwise fst analysis showed peaks in fst value.

Starting with the Northern Atlantic versus the Mid-Atlantic Populations

Northern Atlantic versus the Great Lakes Populations

Mid-Atlantic versus the Great Lakes Populations

Northern Atlantic versus the Finger Lakes Populations

Mid-Atlantic versus the Finger Lakes Populations

There isn’t anything popping up other than the big spike on chromosome 2, even though we see some spikes above 0.25 in Fst on some of the other chromosomes. Let’s just compare the spike regions for chromosome 2.

Success! We’re seeing the same spike in absolute difference of allele frequency in the Mid-Atlantic populations when compared the either Great Lakes or Finger Lakes that we see in the Northern Atlantic vs Mid-Atlantic comparison. Because the allele frequencies aren’t very different between the Northern Atlantic and Great/Finger Lakes at that highly variable site, it looks like the alewife from Northern Atlantic populations (Miramichi and Saco River) may have been the source population for the Great Lakes and the Finger Lakes.

Testing out the differences between Great Lakes and Finger Lakes, which group pretty strongly together in PCA.

LS0tCnRpdGxlOiAiR2Vub21lLXdpZGUgQWxsZWxlIEZyZXF1ZW5jaWVzIgpzdWJ0aXRsZTogIkFsZXdpZmUgUG9wdWxhdGlvbnMgb2YgSW50ZXJlc3QgU3Vic2V0IgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgpgYGB7ciBsaWJyYXJpZXMsIGVjaG8gPSBGQUxTRX0KbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkodmlyaWRpcykKbGlicmFyeShnZ3RleHQpCmBgYApUbyBjYWxjdWxhdGUgdGhlIGFsbGVsZSBmcmVxdWVuY2llcywgSSBiZWdhbiB3aXRoIHRoZSBiY2Ygb3V0cHV0IGZyb20gbWVnYS1wb3N0LWJjZi1leHBsb3JhdG9yeS1zbmFrZWZsb3cgc28gdGhhdCB0aGUgZGF0YSBoYXMgZ29uZSB0aHJvdWdoIGFsbCBvdXIgbm9ybWFsIGZpbHRlcmluZyBzdGVwcy4gVGhlIGJhc2ljIHN0ZXBzIGFyZSB0byBnZXQgdGhlIGdlbm90eXBlIGxpa2VsaWhvb2RzLCBjb252ZXJ0IHRoZSBiY2YgdG8gYSB2Y2YgYW5kIHN1YnNldCBieSBwb3B1bGF0aW9uLCBhbmQgdGhlbiBjYWxjdWxhdGUgdGhlIGFsbGVsZSBmcmVxdWVuY2llcyB1c2luZyBhbmdzZC4gCgpgYGB7YmFzaCwgZXZhbCA9IEZBTFNFfQptYW1iYSBhY3RpdmF0ZSBiY2Z0b29sczEuMTUgI2xvYWQgaW4gYmNmdG9vbHMgZW52aXJvbm1lbnQKYmNmdG9vbHMgK3RhZzJ0YWcgbWFpbi5iY2YgLS0gLXIgLVBMLXRvLUdMID4gZ2Vub2xpa2VzLmJjZiAjIGNvbnZlcnRzIHRoZSBGT1JNQVQvUEwgc291cmNlIHRhZyB0byBGT1JNQVQvR0wsIHNpbmNlIGFuZ3NkIG5lZWRzIHRoZSB0YWcKYmNmdG9vbHMgdmlldyBnZW5vbGlrZXMuYmNmIC1TIHNhbXBsZV9zdWJzZXQudHh0IC1PIHYgLW8gc3Vic2V0X2dlbm9saWtlcy52Y2YgIyBnaXZlbiB0aGUgbGlzdCBvZiBzYW1wbGVzLCBzdWJzZXRzIGFuZCBzYXZlcyBhcyBhIHZjZgphbmdzZCAtdmNmLWdsIHN1YnNldF9nZW5vbGlrZXMudmNmIC1mYWkgZ2Vub21lLmZhc3RhLmZhaSAtbmluZCAxMCAtZG9tYWYgMyAtb3V0IGFuZ3NkX291dHB1dHMvc3Vic2V0ICMgYW5nc2QgY2FsY3VsYXRlcyB0aGUgbWlub3IgYWxsZWxlIGZyZXF1ZW5jaWVzIGJhc2VkIG9uIGFuIGFzc3VtZWQga25vd24gbWFqb3IgYW5kIG1pbm9yIGFsbGVsZSBidXQgdGFrZXMgdGhlIHVuY2VydGFpbnR5IG9mIHRoZSBtaW5vciBhbGxlbGUgaW50byBhY2NvdW50ICgtZG9tYWYgMykgYW5kIHRoZSBudW1iZXIgb2YgaW5kaXZpZHVhbHMgaW4gY2hhbmdlZCBiYXNlZCBvbiBob3cgbWFueSB5b3UgaGF2ZSAodGhpcyBjYW4gYmUgZ3JhYmJlZCB3aXRoIGEgcXVpY2sgd2MgLWwpCmBgYAoKTm93IHdlIHVzZSB0aGUgLm1hZnMuZ3ogb3V0cHV0cyBvZiBhbmdzZCBmb3Igb3VyIHBsb3RzLgpXaGF0IG1ha2VzIHRoZXNlIHZlcnNpb24gMiBpcyB0aGF0IHRoZSBmaXJzdCB0aW1lIEkgY2FsY3VsYXRlZCBhbGxlbGUgZnJlcXVlbmNpZXMgd2l0aCB0aGUgY29ycmVjdGVkIG1ldGFkYXRhIChhbmQgdGh1cyB0aGUgbGFyZ2VyIE1pZC1BdGxhbnRpYyBncm91cCksIEkgZGlkIGl0IGZyb20gdGhlIG1lZ2Etbm9uLW1vZGVsLXdncy1zbmFrZWZsb3cgYmNmICh3aGljaCBpcyBmaWx0ZXJlZCBsZXNzKS4KCmBgYHtyIHJlYWRfYW5kX2ZpbHRlcl9kYXRhLCBlY2hvID0gRkFMU0V9CmdydGxfZnJlcXMgPC0gcmVhZF90c3YoImRhdGEvYWxsZWxlX2ZyZXFzL0dSVEwtdjIubWFmcyIsIAogICAgICAgICAgICAgICAgICAgICAgIHNob3dfY29sX3R5cGVzID0gRkFMU0UpICU+JSAjcmVhZCBpbiBHcmVhdCBMYWtlcyBhbGxlbGUgZnJlcXVlbmNpZXMKICBmaWx0ZXIobkluZCA+PSAyMSkgIyBmaWx0ZXIgc28gdGhhdCBhdCBsZWFzdCA4MCUgb2YgaW5kaXZpZHVhbHMgaGF2ZSByZWFkcyBhdCBhIHNpdGUKZmlubF9mcmVxcyA8LSByZWFkX3RzdigiZGF0YS9hbGxlbGVfZnJlcXMvRklOTC12Mi5tYWZzIiwgCiAgICAgICAgICAgICAgICAgICAgICAgc2hvd19jb2xfdHlwZXMgPSBGQUxTRSkgJT4lICMgcmVhZCBpbiBGaW5nZXIgTGFrZXMgYWxsZWxlIGZyZXF1ZW5jaWVzCiAgZmlsdGVyKG5JbmQgPj0gMTMpCm5hdGxhX2ZyZXFzIDwtIHJlYWRfdHN2KCJkYXRhL2FsbGVsZV9mcmVxcy9OQVRMQS12Mi5tYWZzIiwgCiAgICAgICAgICAgICAgICAgICAgICAgIHNob3dfY29sX3R5cGVzID0gRkFMU0UpICU+JSAjIHJlYWQgaW4gTm9ydGhlcm4gQXRsYW50aWMgQW5hZHJvbW91cyBhbGxlbGUgZnJlcXVlbmNpZXMKICBmaWx0ZXIobkluZCA+PSA2KQptaWRhX2ZyZXFzIDwtIHJlYWRfdHN2KCJkYXRhL2FsbGVsZV9mcmVxcy9NSURBLXYyLm1hZnMiLCAKICAgICAgICAgICAgICAgICAgICAgICBzaG93X2NvbF90eXBlcyA9IEZBTFNFKSAlPiUgIyByZWFkIGluIE1pZC1BdGxhbnRpYyBBbmFkcm9tb3VzIGFsbGVsZSBmcmVxdWVuY2llcwogIGZpbHRlcihuSW5kID49IDEyKQpgYGAKCkluIEVyaWMncyBleGFtcGxlLCBoZSBmaWx0ZXJlZCBieSAzMCBmb3IgNjQgaW5kaXZpZHVhbHMsIHNvIHlvdSBjYW4gcGxheSB3aXRoIGhvdyBoZWF2aWx5IHlvdSB3YW50IHRvIGZpbHRlciB0aGUgZGF0YS4gRm9yIHRoaXMsIEkgcHJlZmVyIDcwLTg1JSBhbmQgdHlwaWNhbGx5IGNob29zZSA4MCUgYW5kIGFsd2F5cyByb3VuZCBkb3duLiBIYXZpbmcgYSBoaWdoZXIgbnVtYmVyIG9mIGluZGl2aWR1YWxzIGhhdmUgaW5mb3JtYXRpb24gYXQgdGhhdCByZWdpb24gbWFrZXMgbWUgbW9yZSBzdXJlIG9mIHRoZSByZXN1bHRzLCBidXQgaXQgbWlnaHQgYmUgcmVhc29uYWJsZSB0byBzdGFydCBhdCA1MCUgb3Igc28ganVzdCB0byBjaGVjayBpdCBvdXQgYmVmb3JlIHN0cmljdGVyIGZpbHRlcmluZy4gCgpOb3csIHdlIGRvIHRoZSBjb21wYXJpc29uczoKYGBge3IgY29tcHN9Cm5hdGxhX21pZGEgPC0gaW5uZXJfam9pbihuYXRsYV9mcmVxcywgCiAgICAgICAgICAgICAgICAgICAgICAgICBtaWRhX2ZyZXFzLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGJ5ID0gYygiY2hyb21vIiwgInBvc2l0aW9uIiksIAogICAgICAgICAgICAgICAgICAgICAgICAgc3VmZml4ID0gYygiX24iLCAiX20iKSkgJT4lICMgam9pbnMgdG9nZXRoZXIgdGhlIG5vcnRoZXJuIGFuZCBtaWQtYXRsYW50aWMgYWxsZWxlIGZyZXF1ZW5jaWVzIGJ5IHRoZSBjaHJvbW9zb21lIGFuZCBwb3NpdGlvbiwga2VlcGluZyB0aGUgb2JzZXJ2YXRpb25zIHRoYXQgbWF0Y2ggYW5kIGtlZXBzIHRoZSBjYWxjdWxhdGVkIHZhbHVlcyBzZXBhcmF0ZQogIG11dGF0ZShhdmVfZnJlcSA9ICh1bmtub3duRU1fbiArIHVua25vd25FTV9tKSAvIDIsICMgdGhlIGF2ZXJhZ2UgZnJlcXVlbmN5IGZyb20gLWRvbWFmIDMKICAgICAgICAgYWJzX2RpZmYgPSBhYnModW5rbm93bkVNX24gLSB1bmtub3duRU1fbSkpICMgdGhlIGFic29sdXRlIGRpZmZlcmVuY2UgaW4gdGhvc2UgZnJlcXVlbmNpZXMKCm5hdGxhX2dydGwgPC0gaW5uZXJfam9pbihuYXRsYV9mcmVxcywgCiAgICAgICAgICAgICAgICAgICAgICAgICBncnRsX2ZyZXFzLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGJ5ID0gYygiY2hyb21vIiwgInBvc2l0aW9uIiksIAogICAgICAgICAgICAgICAgICAgICAgICAgc3VmZml4ID0gYygiX24iLCAiX2ciKSkgJT4lCiAgbXV0YXRlKGF2ZV9mcmVxID0gKHVua25vd25FTV9uICsgdW5rbm93bkVNX2cpIC8gMiwgCiAgICAgICAgIGFic19kaWZmID0gYWJzKHVua25vd25FTV9uIC0gdW5rbm93bkVNX2cpKQoKbWlkYV9ncnRsIDwtIGlubmVyX2pvaW4obWlkYV9mcmVxcywgCiAgICAgICAgICAgICAgICAgICAgICAgIGdydGxfZnJlcXMsIAogICAgICAgICAgICAgICAgICAgICAgICBieSA9IGMoImNocm9tbyIsICJwb3NpdGlvbiIpLCAKICAgICAgICAgICAgICAgICAgICAgICAgc3VmZml4ID0gYygiX20iLCAiX2ciKSkgJT4lCiAgbXV0YXRlKGF2ZV9mcmVxID0gKHVua25vd25FTV9tICsgdW5rbm93bkVNX2cpIC8gMiwgCiAgICAgICAgIGFic19kaWZmID0gYWJzKHVua25vd25FTV9tIC0gdW5rbm93bkVNX2cpKQoKbmF0bGFfZmlubCA8LSBpbm5lcl9qb2luKG5hdGxhX2ZyZXFzLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmxfZnJlcXMsIAogICAgICAgICAgICAgICAgICAgICAgICAgYnkgPSBjKCJjaHJvbW8iLCAicG9zaXRpb24iKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICBzdWZmaXggPSBjKCJfbiIsICJfZiIpKSAlPiUKICBtdXRhdGUoYXZlX2ZyZXEgPSAodW5rbm93bkVNX24gKyB1bmtub3duRU1fZikgLyAyLAogICAgICAgICBhYnNfZGlmZiA9IGFicyh1bmtub3duRU1fbiAtIHVua25vd25FTV9mKSkKbWlkYV9maW5sIDwtIGlubmVyX2pvaW4obWlkYV9mcmVxcywgCiAgICAgICAgICAgICAgICAgICAgICAgICBmaW5sX2ZyZXFzLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGJ5ID0gYygiY2hyb21vIiwgInBvc2l0aW9uIiksIAogICAgICAgICAgICAgICAgICAgICAgICAgc3VmZml4ID0gYygiX20iLCAiX2YiKSkgJT4lCiAgbXV0YXRlKGF2ZV9mcmVxID0gKHVua25vd25FTV9tICsgdW5rbm93bkVNX2YpIC8gMiwKICAgICAgICAgYWJzX2RpZmYgPSBhYnModW5rbm93bkVNX20gLSB1bmtub3duRU1fZikpCmBgYAoKCk5vdyBJJ20gZ29pbmcgdG8gY2hlY2sgdGhlIGRpc3RyaWJ1dGlvbiBvZiBvdXIgZGF0YSB0byBtYWtlIHBsb3R0aW5nIGl0IGVhc2llciwgYW5kIHBpY2sgYSBjdXRvZmYgdGhhdCB3aWxsIHJldGFpbiBtb3N0IG9mIHRoZSBpbmZvcm1hdGlvbi4gCmBgYHtyIGhleGFiaW5zLCBldmFsID0gRkFMU0V9Cm54bV9jaGVjayA8LSBnZ3Bsb3QoZGF0YSA9IG5hdGxhX21pZGEsIAogICAgICAgICAgICAgICAgICAgIG1hcHBpbmcgPSBhZXMoeCA9IGF2ZV9mcmVxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IGFic19kaWZmKSkgKwogIGdlb21faGV4KGJpbndpZHRoID0gMC4wMDEpICsKICBzY2FsZV9maWxsX3ZpcmlkaXNfYygpCm54bV9jaGVjawoKbnhnX2NoZWNrIDwtIGdncGxvdChkYXRhID0gbmF0bGFfZ3J0bCwgCiAgICAgICAgICAgICAgICAgICAgbWFwcGluZyA9IGFlcyhhdmVfZnJlcSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gYWJzX2RpZmYpKSArCiAgZ2VvbV9oZXgoYmlud2lkdGggPSAwLjAwMSkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpc19jKCkKbnhnX2NoZWNrCgpteGdfY2hlY2sgPC0gZ2dwbG90KG1pZGFfZ3J0bCwgCiAgICAgICAgICAgICAgICAgICAgbWFwcGluZyA9IGFlcyh4ID0gYXZlX2ZyZXEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gYWJzX2RpZmYpKSArCiAgZ2VvbV9oZXgoYmlud2lkdGggPSAwLjAwMSkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpc19jKCkKbXhnX2NoZWNrCgpueGZfY2hlY2sgPC0gZ2dwbG90KG5hdGxhX2ZpbmwsIAogICAgICAgICAgICAgICAgICAgIG1hcHBpbmcgPSBhZXMoeCA9IGF2ZV9mcmVxLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSBhYnNfZGlmZikpICsKICBnZW9tX2hleChiaW53aWR0aCA9IDAuMDAxKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzX2MoKQpueGZfY2hlY2sKCm14Zl9jaGVjayA8LSBnZ3Bsb3QobWlkYV9maW5sLCAKICAgICAgICAgICAgICAgICAgICBtYXBwaW5nID0gYWVzKHggPSBhdmVfZnJlcSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gYWJzX2RpZmYpKSArCiAgZ2VvbV9oZXgoYmlud2lkdGggPSAwLjAwMSkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpc19jKCkKbXhmX2NoZWNrCmBgYApJIHdhbnQgdG8gdHJ5IHRvIGtlZXAgdGhpcyBpbiB0aGUgc2FtZSByYW5nZSBhcyBhIDUwLDAwMCBzaXplIHNsaWRpbmcgd2luZG93LCBzbyBJJ20gZ29pbmcgdG8gZmlsdGVyIG15IGRhdGEgZm9yIGFuIGFic29sdXRlIGRpZmZlcmVuY2UgZ3JlYXRlciB0aGFuIDAuMTUKYGBge3IgbW9yZV9maWx0ZXJpbmcsIGVjaG8gPSBGQUxTRX0KbmF0bGFfbWlkYSA8LSBuYXRsYV9taWRhICU+JQogIGZpbHRlcihhYnNfZGlmZiA+IDAuMTUpCm5hdGxhX2dydGwgPC0gbmF0bGFfZ3J0bCAlPiUKICBmaWx0ZXIoYWJzX2RpZmYgPiAwLjE1KQptaWRhX2dydGwgPC0gbWlkYV9ncnRsICU+JQogIGZpbHRlcihhYnNfZGlmZiA+IDAuMTUpCm5hdGxhX2ZpbmwgPC0gbmF0bGFfZmlubCAlPiUKICBmaWx0ZXIoYWJzX2RpZmYgPiAwLjE1KQptaWRhX2ZpbmwgPC0gbWlkYV9maW5sICU+JQogIGZpbHRlcihhYnNfZGlmZiA+IDAuMTUpCmBgYAoKVGhlbiBJIHNldCB1cCB0aGUgZGF0YSBmb3IgcGxvdHRpbmcgYnkgZ2V0dGluZyB0aGUgY2VudGVyIHBvc2l0aW9uIG9mIGVhY2ggY2hyb21vc29tZSwgc28gdGhhdCB0aGUgbGFiZWxzIGFyZSBjZW50ZXJlZCBvbiBlYWNoIGNocm9tb3NvbWUgYW5kIG5vdCByZXBlYXRlZC4gCmBgYHtyIG1vcmVfZGF0YV9vcmcsIGVjaG8gPSBGQUxTRX0KZGF0YV9jdW0gPC0gbmF0bGFfbWlkYSAlPiUKICBncm91cF9ieShjaHJvbW8pICU+JQogIHN1bW1hcmlzZShtYXhfcG9zID0gbWF4KHBvc2l0aW9uKSkgJT4lCiAgbXV0YXRlKHBvc19hZGQgPSBsYWcoY3Vtc3VtKG1heF9wb3MpLCBkZWZhdWx0ID0gMCkpICU+JQogIHNlbGVjdChjaHJvbW8sIHBvc19hZGQpCm5hdGxhX21pZGEgPC0gbmF0bGFfbWlkYSAlPiUKICBpbm5lcl9qb2luKGRhdGFfY3VtLCBieSA9ICJjaHJvbW8iKSAlPiUKICBtdXRhdGUocG9zX2N1bSA9IHBvc2l0aW9uICsgcG9zX2FkZCkKbnhtX2F4aXNfc2V0IDwtIG5hdGxhX21pZGEgJT4lCiAgZ3JvdXBfYnkoY2hyb21vKSAlPiUKICBzdW1tYXJpc2UoY2VudGVyID0gbWVhbihwb3NfY3VtKSkKCmRhdGFfY3VtIDwtIG5hdGxhX2dydGwgJT4lCiAgZ3JvdXBfYnkoY2hyb21vKSAlPiUKICBzdW1tYXJpc2UobWF4X3BvcyA9IG1heChwb3NpdGlvbikpICU+JQogIG11dGF0ZShwb3NfYWRkID0gbGFnKGN1bXN1bShtYXhfcG9zKSwgZGVmYXVsdCA9IDApKSAlPiUKICBzZWxlY3QoY2hyb21vLCBwb3NfYWRkKQpuYXRsYV9ncnRsIDwtIG5hdGxhX2dydGwgJT4lCiAgaW5uZXJfam9pbihkYXRhX2N1bSwgYnkgPSAiY2hyb21vIikgJT4lCiAgbXV0YXRlKHBvc19jdW0gPSBwb3NpdGlvbiArIHBvc19hZGQpCm54Z19heGlzX3NldCA8LSBuYXRsYV9ncnRsICU+JQogIGdyb3VwX2J5KGNocm9tbykgJT4lCiAgc3VtbWFyaXNlKGNlbnRlciA9IG1lYW4ocG9zX2N1bSkpCgpkYXRhX2N1bSA8LSBtaWRhX2dydGwgJT4lCiAgZ3JvdXBfYnkoY2hyb21vKSAlPiUKICBzdW1tYXJpc2UobWF4X3BvcyA9IG1heChwb3NpdGlvbikpICU+JQogIG11dGF0ZShwb3NfYWRkID0gbGFnKGN1bXN1bShtYXhfcG9zKSwgZGVmYXVsdCA9IDApKSAlPiUKICBzZWxlY3QoY2hyb21vLCBwb3NfYWRkKQptaWRhX2dydGwgPC0gbWlkYV9ncnRsICU+JQogIGlubmVyX2pvaW4oZGF0YV9jdW0sIGJ5ID0gImNocm9tbyIpICU+JQogIG11dGF0ZShwb3NfY3VtID0gcG9zaXRpb24gKyBwb3NfYWRkKQpteGdfYXhpc19zZXQgPC0gbWlkYV9ncnRsICU+JQogIGdyb3VwX2J5KGNocm9tbykgJT4lCiAgc3VtbWFyaXNlKGNlbnRlciA9IG1lYW4ocG9zX2N1bSkpCgpkYXRhX2N1bSA8LSBuYXRsYV9maW5sICU+JQogIGdyb3VwX2J5KGNocm9tbykgJT4lCiAgc3VtbWFyaXNlKG1heF9wb3MgPSBtYXgocG9zaXRpb24pKSAlPiUKICBtdXRhdGUocG9zX2FkZCA9IGxhZyhjdW1zdW0obWF4X3BvcyksIGRlZmF1bHQgPSAwKSkgJT4lCiAgc2VsZWN0KGNocm9tbywgcG9zX2FkZCkKbmF0bGFfZmlubCA8LSBuYXRsYV9maW5sICU+JQogIGlubmVyX2pvaW4oZGF0YV9jdW0sIGJ5ID0gImNocm9tbyIpICU+JQogIG11dGF0ZShwb3NfY3VtID0gcG9zaXRpb24gKyBwb3NfYWRkKQpueGZfYXhpc19zZXQgPC0gbmF0bGFfZmlubCAlPiUKICBncm91cF9ieShjaHJvbW8pICU+JQogIHN1bW1hcmlzZShjZW50ZXIgPSBtZWFuKHBvc19jdW0pKQoKZGF0YV9jdW0gPC0gbWlkYV9maW5sICU+JQogIGdyb3VwX2J5KGNocm9tbykgJT4lCiAgc3VtbWFyaXNlKG1heF9wb3MgPSBtYXgocG9zaXRpb24pKSAlPiUKICBtdXRhdGUocG9zX2FkZCA9IGxhZyhjdW1zdW0obWF4X3BvcyksIGRlZmF1bHQgPSAwKSkgJT4lCiAgc2VsZWN0KGNocm9tbywgcG9zX2FkZCkKbWlkYV9maW5sIDwtIG1pZGFfZmlubCAlPiUKICBpbm5lcl9qb2luKGRhdGFfY3VtLCBieSA9ICJjaHJvbW8iKSAlPiUKICBtdXRhdGUocG9zX2N1bSA9IHBvc2l0aW9uICsgcG9zX2FkZCkKbXhmX2F4aXNfc2V0IDwtIG1pZGFfZmlubCAlPiUKICBncm91cF9ieShjaHJvbW8pICU+JQogIHN1bW1hcmlzZShjZW50ZXIgPSBtZWFuKHBvc19jdW0pKQpgYGAKCkZpbmFsbHksIEkgcGxvdCB0aGUgYWJzb2x1dGUgZGlmZmVyZW5jZXMgb2YgdGhlIGFsbGVsZSBmcmVxdWVuY2llcyBhY3Jvc3MgdGhlIGVudGlyZSBnZW5vbWUsIGZvY3VzaW5nIG9uIHRoZSBzZWN0aW9ucyB0aGF0IHRoZSBwYWlyd2lzZSBmc3QgYW5hbHlzaXMgc2hvd2VkIHBlYWtzIGluIGZzdCB2YWx1ZS4KClN0YXJ0aW5nIHdpdGggdGhlIE5vcnRoZXJuIEF0bGFudGljIHZlcnN1cyB0aGUgTWlkLUF0bGFudGljIFBvcHVsYXRpb25zCmBgYHtyIG5vcnRoeG1pZF9hdGxfcGxvdCwgZWNobyA9IEZBTFNFfQpueG1fcGxvdCA8LSBnZ3Bsb3QoZGF0YSA9IG5hdGxhX21pZGEsCiAgICAgICAgICAgICAgICAgICBtYXBwaW5nID0gYWVzKHggPSBwb3NfY3VtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gYWJzX2RpZmYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yID0gYXNfZmFjdG9yKGNocm9tbykpKSArCiAgZ2VvbV9wb2ludChhbHBoYSA9IDAuNzUsIHNpemUgPSAxKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGxhYmVsID0gbnhtX2F4aXNfc2V0JGNocm9tbywKICAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gbnhtX2F4aXNfc2V0JGNlbnRlcikgKwogIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBjKDAsMCksCiAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoMC4xNSwgMS4wNSkpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gcmVwKGMoIiMyNDJiMzUiLCAiIzg2OWNhOCIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pcXVlKGxlbmd0aChueG1fYXhpc19zZXQkY2hyb21vKSkpKSArCiAgbGFicyh4ID0gTlVMTCwKICAgICAgIHkgPSAiQWJzb2x1dGUgRGlmZmVyZW5jZSBpbiBBbGxlbGUgRnJlcXVlbmN5IiwKICAgICAgIHRpdGxlID0gIk4uIEF0bGFudGljIHZzLiBNaWQtQXRsYW50aWMgQW5hZHJvbW91cyBBbGV3aWZlIikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwKICAgICAgICBwYW5lbC5ncmlkLm1ham9yLnggPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgcGFuZWwuZ3JpZC5taW5vci54ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfbWFya2Rvd24oKSwKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2anVzdCA9IDAuNSkpCm54bV9wbG90CgojIyMgQ2hyb21vc29tZXMgb2YgSW50ZXJlc3QgIyMjCm54bV9jaHIxX3Bsb3QgPC0gZ2dwbG90KGRhdGEgPSBmaWx0ZXIobmF0bGFfbWlkYSwgY2hyb21vID09ICJOQ18wNTU5NTcuMSIpLCAKICAgICAgICAgICAgICAgICAgICAgbWFwcGluZyA9IGFlcyh4ID0gcG9zX2N1bSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IGFic19kaWZmKSkgKwogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjc1LCBzaXplID0gMC41LCBjb2xvciA9ICIjMjQyYjM1IikgKwogIHNjYWxlX3hfY29udGludW91cyhsYWJlbCA9IG54bV9heGlzX3NldCRjaHJvbW8sIAogICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBueG1fYXhpc19zZXQkY2VudGVyKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGMoMCwwKSwgCiAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoMC4xNSwgMS4wNSkpICsKICBsYWJzKHggPSBOVUxMLCAKICAgICAgIHkgPSAiQWJzb2x1dGUgRGlmZmVyZW5jZSBpbiBBbGxlbGUgRnJlcXVlbmN5IiwgCiAgICAgICB0aXRsZSA9ICJOLiBBdGxhbnRpYyB2cy4gTWlkLUF0bGFudGljIEFuYWRyb21vdXMgQWxld2lmZSIsIAogICAgICAgc3VidGl0bGUgPSAiQ2hyb21vc29tZSAxIikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwKICAgICAgICBwYW5lbC5ncmlkLm1ham9yLnggPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgcGFuZWwuZ3JpZC5taW5vci54ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfbWFya2Rvd24oKSwKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2anVzdCA9IDAuNSkpCm54bV9jaHIxX3Bsb3QKCm54bV9jaHIyX3Bsb3QgPC0gZ2dwbG90KGRhdGEgPSBmaWx0ZXIobmF0bGFfbWlkYSwgY2hyb21vID09ICJOQ18wNTU5NTguMSIpLCAKICAgICAgICAgICAgICAgICAgICAgbWFwcGluZyA9IGFlcyh4ID0gcG9zX2N1bSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IGFic19kaWZmKSkgKwogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjc1LCBzaXplID0gMC41LCBjb2xvciA9ICIjODY5Y2E4IikgKwogIHNjYWxlX3hfY29udGludW91cyhsYWJlbCA9IG54bV9heGlzX3NldCRjaHJvbW8sIAogICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBueG1fYXhpc19zZXQkY2VudGVyKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGMoMCwwKSwgCiAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoMC4xNSwgMS4wNSkpICsKICBsYWJzKHggPSBOVUxMLCAKICAgICAgIHkgPSAiQWJzb2x1dGUgRGlmZmVyZW5jZSBpbiBBbGxlbGUgRnJlcXVlbmN5IiwgCiAgICAgICB0aXRsZSA9ICJOLiBBdGxhbnRpYyB2cy4gTWlkLUF0bGFudGljIEFuYWRyb21vdXMgQWxld2lmZSIsIAogICAgICAgc3VidGl0bGUgPSAiQ2hyb21vc29tZSAyIikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwKICAgICAgICBwYW5lbC5ncmlkLm1ham9yLnggPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgcGFuZWwuZ3JpZC5taW5vci54ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfbWFya2Rvd24oKSwKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2anVzdCA9IDAuNSkpCm54bV9jaHIyX3Bsb3QKCm54bV9jaHIzX3Bsb3QgPC0gZ2dwbG90KGRhdGEgPSBmaWx0ZXIobmF0bGFfbWlkYSwgY2hyb21vID09ICJOQ18wNTU5NTkuMSIpLCAKICAgICAgICAgICAgICAgICAgICAgbWFwcGluZyA9IGFlcyh4ID0gcG9zX2N1bSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IGFic19kaWZmKSkgKwogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjc1LCBzaXplID0gMC41LCBjb2xvciA9ICIjMjQyYjM1IikgKwogIHNjYWxlX3hfY29udGludW91cyhsYWJlbCA9IG54bV9heGlzX3NldCRjaHJvbW8sIAogICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBueG1fYXhpc19zZXQkY2VudGVyKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGMoMCwwKSwgCiAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoMC4xNSwgMS4wNSkpICsKICBsYWJzKHggPSBOVUxMLCAKICAgICAgIHkgPSAiQWJzb2x1dGUgRGlmZmVyZW5jZSBpbiBBbGxlbGUgRnJlcXVlbmN5IiwgCiAgICAgICB0aXRsZSA9ICJOLiBBdGxhbnRpYyB2cy4gTWlkLUF0bGFudGljIEFuYWRyb21vdXMgQWxld2lmZSIsIAogICAgICAgc3VidGl0bGUgPSAiQ2hyb21vc29tZSAzIikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwKICAgICAgICBwYW5lbC5ncmlkLm1ham9yLnggPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgcGFuZWwuZ3JpZC5taW5vci54ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfbWFya2Rvd24oKSwKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2anVzdCA9IDAuNSkpCm54bV9jaHIzX3Bsb3QKCm54bV9jaHIxMF9wbG90IDwtIGdncGxvdChkYXRhID0gZmlsdGVyKG5hdGxhX21pZGEsIGNocm9tbyA9PSAiTkNfMDU1OTY2LjEiKSwgCiAgICAgICAgICAgICAgICAgICAgIG1hcHBpbmcgPSBhZXMoeCA9IHBvc19jdW0sIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSBhYnNfZGlmZikpICsKICBnZW9tX3BvaW50KGFscGhhID0gMC43NSwgc2l6ZSA9IDAuNSwgY29sb3IgPSAiIzI0MmIzNSIpICsKICBzY2FsZV94X2NvbnRpbnVvdXMobGFiZWwgPSBueG1fYXhpc19zZXQkY2hyb21vLCAKICAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gbnhtX2F4aXNfc2V0JGNlbnRlcikgKwogIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBjKDAsMCksIAogICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKDAuMTUsIDEuMDUpKSArCiAgbGFicyh4ID0gTlVMTCwgCiAgICAgICB5ID0gIkFic29sdXRlIERpZmZlcmVuY2UgaW4gQWxsZWxlIEZyZXF1ZW5jeSIsIAogICAgICAgdGl0bGUgPSAiTi4gQXRsYW50aWMgdnMuIE1pZC1BdGxhbnRpYyBBbmFkcm9tb3VzIEFsZXdpZmUiLCAKICAgICAgIHN1YnRpdGxlID0gIkNocm9tb3NvbWUgMTAiKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLAogICAgICAgIHBhbmVsLmdyaWQubWFqb3IueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBwYW5lbC5ncmlkLm1pbm9yLnggPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF9tYXJrZG93bigpLAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gOCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZqdXN0ID0gMC41KSkKbnhtX2NocjEwX3Bsb3QKCm54bV9jaHIxMl9wbG90IDwtIGdncGxvdChkYXRhID0gZmlsdGVyKG5hdGxhX21pZGEsIGNocm9tbyA9PSAiTkNfMDU1OTY4LjEiKSwgCiAgICAgICAgICAgICAgICAgICAgIG1hcHBpbmcgPSBhZXMoeCA9IHBvc19jdW0sIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSBhYnNfZGlmZikpICsKICBnZW9tX3BvaW50KGFscGhhID0gMC43NSwgc2l6ZSA9IDAuNSwgY29sb3IgPSAiIzI0MmIzNSIpICsKICBzY2FsZV94X2NvbnRpbnVvdXMobGFiZWwgPSBueG1fYXhpc19zZXQkY2hyb21vLCAKICAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gbnhtX2F4aXNfc2V0JGNlbnRlcikgKwogIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBjKDAsMCksIAogICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKDAuMTUsIDEuMDUpKSArCiAgbGFicyh4ID0gTlVMTCwgCiAgICAgICB5ID0gIkFic29sdXRlIERpZmZlcmVuY2UgaW4gQWxsZWxlIEZyZXF1ZW5jeSIsIAogICAgICAgdGl0bGUgPSAiTi4gQXRsYW50aWMgdnMuIE1pZC1BdGxhbnRpYyBBbmFkcm9tb3VzIEFsZXdpZmUiLCAKICAgICAgIHN1YnRpdGxlID0gIkNocm9tb3NvbWUgMTIiKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLAogICAgICAgIHBhbmVsLmdyaWQubWFqb3IueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBwYW5lbC5ncmlkLm1pbm9yLnggPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF9tYXJrZG93bigpLAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gOCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZqdXN0ID0gMC41KSkKbnhtX2NocjEyX3Bsb3QKCiMjIyBDaHJvbW9zb21lIDIgU3Bpa2UgUmVnaW9uICMjIwoKbnhtX3NwaWtlX3Bsb3QgPC0gbmF0bGFfbWlkYSAlPiUKICBmaWx0ZXIoY2hyb21vID09ICJOQ18wNTU5NTguMSIpICU+JQogIGZpbHRlcihwb3NpdGlvbiA+PSAxNjYwMDAwMCkgJT4lCiAgZmlsdGVyKHBvc2l0aW9uIDw9IDE3MDAwMDAwKSAlPiUKICBnZ3Bsb3QoLiwKICAgICAgICAgbWFwcGluZyA9IGFlcyh4ID0gcG9zaXRpb24sIAogICAgICAgICAgICAgICAgICAgICAgIHkgPSBhYnNfZGlmZikpICsKICBnZW9tX3BvaW50KGFscGhhID0gMC43NSwgY29sb3IgPSAiIzg2OWNhOCIsIHNpemUgPSAyKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGMoMCwwKSwgCiAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoMC4xNSwgMS4wNSkpICsKICBsYWJzKHggPSAiUG9zaXRpb24iLCAKICAgICAgIHkgPSAiQWJzb2x1dGUgRGlmZmVyZW5jZSBpbiBBbGxlbGUgRnJlcXVlbmN5IiwgCiAgICAgICB0aXRsZSA9ICJNaWQtQXRsYW50aWMgdnMgTi4gQXRsYW50aWMgQW5hZHJvbW91cyBBbGV3aWZlIENocm9tb3NvbWUgMiIsIAogICAgICAgc3VidGl0bGUgPSAiMTY2MDAwMDAuLjE3MDAwMDAwIikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwKICAgICAgICBwYW5lbC5ncmlkLm1ham9yLnggPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgcGFuZWwuZ3JpZC5taW5vci54ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfbWFya2Rvd24oKSwKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2anVzdCA9IDAuNSkpCmBgYApOb3J0aGVybiBBdGxhbnRpYyB2ZXJzdXMgdGhlIEdyZWF0IExha2VzIFBvcHVsYXRpb25zCmBgYHtyIG5vcnRoeGdyZWF0X3Bsb3QsIGVjaG8gPSBGQUxTRX0KbnhnX3Bsb3QgPC0gZ2dwbG90KGRhdGEgPSBuYXRsYV9ncnRsLAogICAgICAgICAgICAgICAgICAgbWFwcGluZyA9IGFlcyh4ID0gcG9zX2N1bSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IGFic19kaWZmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvciA9IGFzX2ZhY3RvcihjaHJvbW8pKSkgKwogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjc1LCBzaXplID0gMSkgKwogIHNjYWxlX3hfY29udGludW91cyhsYWJlbCA9IG54Z19heGlzX3NldCRjaHJvbW8sCiAgICAgICAgICAgICAgICAgICAgIGJyZWFrcyA9IG54Z19heGlzX3NldCRjZW50ZXIpICsKICBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gYygwLDApLAogICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKDAuMTUsIDEuMDUpKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IHJlcChjKCIjMjQyYjM1IiwgIiM4NjljYTgiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXF1ZShsZW5ndGgobnhnX2F4aXNfc2V0JGNocm9tbykpKSkgKwogIGxhYnMoeCA9IE5VTEwsCiAgICAgICB5ID0gIkFic29sdXRlIERpZmZlcmVuY2UgaW4gQWxsZWxlIEZyZXF1ZW5jeSIsCiAgICAgICB0aXRsZSA9ICJOLiBBdGxhbnRpYyBBbmFkcm9tb3VzIHZzLiBHcmVhdCBMYWtlcyBMYW5kbG9ja2VkIEFsZXdpZmUiKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLAogICAgICAgIHBhbmVsLmdyaWQubWFqb3IueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBwYW5lbC5ncmlkLm1pbm9yLnggPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF9tYXJrZG93bigpLAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gOCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZqdXN0ID0gMC41KSkKbnhnX3Bsb3QKCiMjIyBDaHJvbW9zb21lcyBvZiBJbnRlcmVzdCAjIyMKbnhnX2NocjFfcGxvdCA8LSBnZ3Bsb3QoZGF0YSA9IGZpbHRlcihuYXRsYV9ncnRsLCBjaHJvbW8gPT0gIk5DXzA1NTk1Ny4xIiksIAogICAgICAgICAgICAgICAgICAgICBtYXBwaW5nID0gYWVzKHggPSBwb3NfY3VtLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gYWJzX2RpZmYpKSArCiAgZ2VvbV9wb2ludChhbHBoYSA9IDAuNzUsIHNpemUgPSAwLjUsIGNvbG9yID0gIiMyNDJiMzUiKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGxhYmVsID0gbnhnX2F4aXNfc2V0JGNocm9tbywgCiAgICAgICAgICAgICAgICAgICAgIGJyZWFrcyA9IG54Z19heGlzX3NldCRjZW50ZXIpICsKICBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gYygwLDApLCAKICAgICAgICAgICAgICAgICAgICAgbGltaXRzID0gYygwLjE1LCAxLjA1KSkgKwogIGxhYnMoeCA9IE5VTEwsIAogICAgICAgeSA9ICJBYnNvbHV0ZSBEaWZmZXJlbmNlIGluIEFsbGVsZSBGcmVxdWVuY3kiLCAKICAgICAgIHRpdGxlID0gIk4uIEF0bGFudGljIEFuYWRyb21vdXMgdnMgR3JlYXQgTGFrZXMgTGFuZGxvY2tlZCBBbGV3aWZlIiwgCiAgICAgICBzdWJ0aXRsZSA9ICJDaHJvbW9zb21lIDEiKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLAogICAgICAgIHBhbmVsLmdyaWQubWFqb3IueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBwYW5lbC5ncmlkLm1pbm9yLnggPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF9tYXJrZG93bigpLAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gOCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZqdXN0ID0gMC41KSkKbnhnX2NocjFfcGxvdAoKbnhnX2NocjJfcGxvdCA8LSBnZ3Bsb3QoZGF0YSA9IGZpbHRlcihuYXRsYV9ncnRsLCBjaHJvbW8gPT0gIk5DXzA1NTk1OC4xIiksIAogICAgICAgICAgICAgICAgICAgICBtYXBwaW5nID0gYWVzKHggPSBwb3NfY3VtLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gYWJzX2RpZmYpKSArCiAgZ2VvbV9wb2ludChhbHBoYSA9IDAuNzUsIHNpemUgPSAwLjUsIGNvbG9yID0gIiM4NjljYTgiKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGxhYmVsID0gbnhnX2F4aXNfc2V0JGNocm9tbywgCiAgICAgICAgICAgICAgICAgICAgIGJyZWFrcyA9IG54Z19heGlzX3NldCRjZW50ZXIpICsKICBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gYygwLDApLCAKICAgICAgICAgICAgICAgICAgICAgbGltaXRzID0gYygwLjE1LCAxLjA1KSkgKwogIGxhYnMoeCA9IE5VTEwsIAogICAgICAgeSA9ICJBYnNvbHV0ZSBEaWZmZXJlbmNlIGluIEFsbGVsZSBGcmVxdWVuY3kiLCAKICAgICAgIHRpdGxlID0gIk4uIEF0bGFudGljIEFuYWRyb21vdXMgdnMgR3JlYXQgTGFrZXMgTGFuZGxvY2tlZCBBbGV3aWZlIiwgCiAgICAgICBzdWJ0aXRsZSA9ICJDaHJvbW9zb21lIDIiKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLAogICAgICAgIHBhbmVsLmdyaWQubWFqb3IueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBwYW5lbC5ncmlkLm1pbm9yLnggPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF9tYXJrZG93bigpLAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gOCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZqdXN0ID0gMC41KSkKbnhnX2NocjJfcGxvdAoKbnhnX2NocjNfcGxvdCA8LSBnZ3Bsb3QoZGF0YSA9IGZpbHRlcihuYXRsYV9ncnRsLCBjaHJvbW8gPT0gIk5DXzA1NTk1OS4xIiksIAogICAgICAgICAgICAgICAgICAgICBtYXBwaW5nID0gYWVzKHggPSBwb3NfY3VtLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gYWJzX2RpZmYpKSArCiAgZ2VvbV9wb2ludChhbHBoYSA9IDAuNzUsIHNpemUgPSAwLjUsIGNvbG9yID0gIiMyNDJiMzUiKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGxhYmVsID0gbnhnX2F4aXNfc2V0JGNocm9tbywgCiAgICAgICAgICAgICAgICAgICAgIGJyZWFrcyA9IG54Z19heGlzX3NldCRjZW50ZXIpICsKICBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gYygwLDApLCAKICAgICAgICAgICAgICAgICAgICAgbGltaXRzID0gYygwLjE1LCAxLjA1KSkgKwogIGxhYnMoeCA9IE5VTEwsIAogICAgICAgeSA9ICJBYnNvbHV0ZSBEaWZmZXJlbmNlIGluIEFsbGVsZSBGcmVxdWVuY3kiLCAKICAgICAgIHRpdGxlID0gIk4uIEF0bGFudGljIEFuYWRyb21vdXMgdnMgR3JlYXQgTGFrZXMgTGFuZGxvY2tlZCBBbGV3aWZlIiwgCiAgICAgICBzdWJ0aXRsZSA9ICJDaHJvbW9zb21lIDMiKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLAogICAgICAgIHBhbmVsLmdyaWQubWFqb3IueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBwYW5lbC5ncmlkLm1pbm9yLnggPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF9tYXJrZG93bigpLAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gOCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZqdXN0ID0gMC41KSkKbnhnX2NocjNfcGxvdAoKbnhnX2NocjEwX3Bsb3QgPC0gZ2dwbG90KGRhdGEgPSBmaWx0ZXIobmF0bGFfZ3J0bCwgY2hyb21vID09ICJOQ18wNTU5NjYuMSIpLCAKICAgICAgICAgICAgICAgICAgICAgbWFwcGluZyA9IGFlcyh4ID0gcG9zX2N1bSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IGFic19kaWZmKSkgKwogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjc1LCBzaXplID0gMC41LCBjb2xvciA9ICIjMjQyYjM1IikgKwogIHNjYWxlX3hfY29udGludW91cyhsYWJlbCA9IG54Z19heGlzX3NldCRjaHJvbW8sIAogICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBueGdfYXhpc19zZXQkY2VudGVyKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGMoMCwwKSwgCiAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoMC4xNSwgMS4wNSkpICsKICBsYWJzKHggPSBOVUxMLCAKICAgICAgIHkgPSAiQWJzb2x1dGUgRGlmZmVyZW5jZSBpbiBBbGxlbGUgRnJlcXVlbmN5IiwgCiAgICAgICB0aXRsZSA9ICJOLiBBdGxhbnRpYyBBbmFkcm9tb3VzIHZzIEdyZWF0IExha2VzIExhbmRsb2NrZWQgQWxld2lmZSIsIAogICAgICAgc3VidGl0bGUgPSAiQ2hyb21vc29tZSAxMCIpICsKICB0aGVtZV9idygpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsCiAgICAgICAgcGFuZWwuZ3JpZC5tYWpvci54ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIHBhbmVsLmdyaWQubWlub3IueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X21hcmtkb3duKCksCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSA4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmp1c3QgPSAwLjUpKQpueGdfY2hyMTBfcGxvdAoKbnhnX2NocjEyX3Bsb3QgPC0gZ2dwbG90KGRhdGEgPSBmaWx0ZXIobmF0bGFfZ3J0bCwgY2hyb21vID09ICJOQ18wNTU5NjguMSIpLCAKICAgICAgICAgICAgICAgICAgICAgbWFwcGluZyA9IGFlcyh4ID0gcG9zX2N1bSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IGFic19kaWZmKSkgKwogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjc1LCBzaXplID0gMC41LCBjb2xvciA9ICIjMjQyYjM1IikgKwogIHNjYWxlX3hfY29udGludW91cyhsYWJlbCA9IG54Z19heGlzX3NldCRjaHJvbW8sIAogICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBueGdfYXhpc19zZXQkY2VudGVyKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGMoMCwwKSwgCiAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoMC4xNSwgMS4wNSkpICsKICBsYWJzKHggPSBOVUxMLCAKICAgICAgIHkgPSAiQWJzb2x1dGUgRGlmZmVyZW5jZSBpbiBBbGxlbGUgRnJlcXVlbmN5IiwgCiAgICAgICB0aXRsZSA9ICJOLiBBdGxhbnRpYyBBbmFkcm9tb3VzIHZzIEdyZWF0IExha2VzIExhbmRsb2NrZWQgQWxld2lmZSIsIAogICAgICAgc3VidGl0bGUgPSAiQ2hyb21vc29tZSAxMiIpICsKICB0aGVtZV9idygpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsCiAgICAgICAgcGFuZWwuZ3JpZC5tYWpvci54ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIHBhbmVsLmdyaWQubWlub3IueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X21hcmtkb3duKCksCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSA4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmp1c3QgPSAwLjUpKQpueGdfY2hyMTJfcGxvdAoKIyMjIENocm9tb3NvbWUgMiBTcGlrZSBSZWdpb24gIyMjCgpueGdfc3Bpa2VfcGxvdCA8LSBuYXRsYV9ncnRsICU+JQogIGZpbHRlcihjaHJvbW8gPT0gIk5DXzA1NTk1OC4xIikgJT4lCiAgZmlsdGVyKHBvc2l0aW9uID49IDE2NjAwMDAwKSAlPiUKICBmaWx0ZXIocG9zaXRpb24gPD0gMTcwMDAwMDApICU+JQogIGdncGxvdCguLAogICAgICAgICBtYXBwaW5nID0gYWVzKHggPSBwb3NpdGlvbiwgCiAgICAgICAgICAgICAgICAgICAgICAgeSA9IGFic19kaWZmKSkgKwogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjc1LCBjb2xvciA9ICIjODY5Y2E4Iiwgc2l6ZSA9IDIpICsKICBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gYygwLDApLCAKICAgICAgICAgICAgICAgICAgICAgbGltaXRzID0gYygwLjE1LCAxLjA1KSkgKwogIGxhYnMoeCA9ICJQb3NpdGlvbiIsIAogICAgICAgeSA9ICJBYnNvbHV0ZSBEaWZmZXJlbmNlIGluIEFsbGVsZSBGcmVxdWVuY3kiLCAKICAgICAgIHRpdGxlID0gIk4uIEF0bGFudGljIEFuYWRyb21vdXMgdnMgR3JlYXQgTGFrZXMgTGFuZGxvY2tlZCBBbGV3aWZlIENocm9tb3NvbWUgMiIsIAogICAgICAgc3VidGl0bGUgPSAiMTY2MDAwMDAuLjE3MDAwMDAwIikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwKICAgICAgICBwYW5lbC5ncmlkLm1ham9yLnggPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgcGFuZWwuZ3JpZC5taW5vci54ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfbWFya2Rvd24oKSwKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2anVzdCA9IDAuNSkpCmBgYApNaWQtQXRsYW50aWMgdmVyc3VzIHRoZSBHcmVhdCBMYWtlcyBQb3B1bGF0aW9ucwpgYGB7ciBtaWR4Z3JlYXRfcGxvdCwgZWNobyA9IEZBTFNFfQpteGdfcGxvdCA8LSBnZ3Bsb3QoZGF0YSA9IG1pZGFfZ3J0bCwKICAgICAgICAgICAgICAgICAgIG1hcHBpbmcgPSBhZXMoeCA9IHBvc19jdW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSBhYnNfZGlmZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IgPSBhc19mYWN0b3IoY2hyb21vKSkpICsKICBnZW9tX3BvaW50KGFscGhhID0gMC43NSwgc2l6ZSA9IDEpICsKICBzY2FsZV94X2NvbnRpbnVvdXMobGFiZWwgPSBteGdfYXhpc19zZXQkY2hyb21vLAogICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBteGdfYXhpc19zZXQkY2VudGVyKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGMoMCwwKSwKICAgICAgICAgICAgICAgICAgICAgbGltaXRzID0gYygwLjE1LCAxLjA1KSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSByZXAoYygiIzI0MmIzNSIsICIjODY5Y2E4IiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmlxdWUobGVuZ3RoKG14Z19heGlzX3NldCRjaHJvbW8pKSkpICsKICBsYWJzKHggPSBOVUxMLAogICAgICAgeSA9ICJBYnNvbHV0ZSBEaWZmZXJlbmNlIGluIEFsbGVsZSBGcmVxdWVuY3kiLAogICAgICAgdGl0bGUgPSAiTWlkLUF0bGFudGljIEFuYWRyb21vdXMgdnMgR3JlYXQgTGFrZXMgTGFuZGxvY2tlZCBBbGV3aWZlIikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwKICAgICAgICBwYW5lbC5ncmlkLm1ham9yLnggPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgcGFuZWwuZ3JpZC5taW5vci54ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfbWFya2Rvd24oKSwKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2anVzdCA9IDAuNSkpCm14Z19wbG90CgojIyMgQ2hyb21vc29tZXMgb2YgSW50ZXJlc3QgIyMjCm14Z19jaHIxX3Bsb3QgPC0gZ2dwbG90KGRhdGEgPSBmaWx0ZXIobWlkYV9ncnRsLCBjaHJvbW8gPT0gIk5DXzA1NTk1Ny4xIiksIAogICAgICAgICAgICAgICAgICAgICBtYXBwaW5nID0gYWVzKHggPSBwb3NfY3VtLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gYWJzX2RpZmYpKSArCiAgZ2VvbV9wb2ludChhbHBoYSA9IDAuNzUsIHNpemUgPSAwLjUsIGNvbG9yID0gIiMyNDJiMzUiKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGxhYmVsID0gbXhnX2F4aXNfc2V0JGNocm9tbywgCiAgICAgICAgICAgICAgICAgICAgIGJyZWFrcyA9IG14Z19heGlzX3NldCRjZW50ZXIpICsKICBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gYygwLDApLCAKICAgICAgICAgICAgICAgICAgICAgbGltaXRzID0gYygwLjE1LCAxLjA1KSkgKwogIGxhYnMoeCA9IE5VTEwsIAogICAgICAgeSA9ICJBYnNvbHV0ZSBEaWZmZXJlbmNlIGluIEFsbGVsZSBGcmVxdWVuY3kiLCAKICAgICAgIHRpdGxlID0gIk1pZC1BdGxhbnRpYyBBbmFkcm9tb3VzIHZzIEdyZWF0IExha2VzIExhbmRsb2NrZWQgQWxld2lmZSIsIAogICAgICAgc3VidGl0bGUgPSAiQ2hyb21vc29tZSAxIikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwKICAgICAgICBwYW5lbC5ncmlkLm1ham9yLnggPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgcGFuZWwuZ3JpZC5taW5vci54ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfbWFya2Rvd24oKSwKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2anVzdCA9IDAuNSkpCm14Z19jaHIxX3Bsb3QKCm14Z19jaHIyX3Bsb3QgPC0gZ2dwbG90KGRhdGEgPSBmaWx0ZXIobWlkYV9ncnRsLCBjaHJvbW8gPT0gIk5DXzA1NTk1OC4xIiksIAogICAgICAgICAgICAgICAgICAgICBtYXBwaW5nID0gYWVzKHggPSBwb3NfY3VtLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gYWJzX2RpZmYpKSArCiAgZ2VvbV9wb2ludChhbHBoYSA9IDAuNzUsIHNpemUgPSAwLjUsIGNvbG9yID0gIiM4NjljYTgiKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGxhYmVsID0gbXhnX2F4aXNfc2V0JGNocm9tbywgCiAgICAgICAgICAgICAgICAgICAgIGJyZWFrcyA9IG14Z19heGlzX3NldCRjZW50ZXIpICsKICBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gYygwLDApLCAKICAgICAgICAgICAgICAgICAgICAgbGltaXRzID0gYygwLjE1LCAxLjA1KSkgKwogIGxhYnMoeCA9IE5VTEwsIAogICAgICAgeSA9ICJBYnNvbHV0ZSBEaWZmZXJlbmNlIGluIEFsbGVsZSBGcmVxdWVuY3kiLCAKICAgICAgIHRpdGxlID0gIk1pZC1BdGxhbnRpYyBBbmFkcm9tb3VzIHZzIEdyZWF0IExha2VzIExhbmRsb2NrZWQgQWxld2lmZSIsIAogICAgICAgc3VidGl0bGUgPSAiQ2hyb21vc29tZSAyIikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwKICAgICAgICBwYW5lbC5ncmlkLm1ham9yLnggPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgcGFuZWwuZ3JpZC5taW5vci54ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfbWFya2Rvd24oKSwKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2anVzdCA9IDAuNSkpCm14Z19jaHIyX3Bsb3QKCm14Z19jaHIzX3Bsb3QgPC0gZ2dwbG90KGRhdGEgPSBmaWx0ZXIobWlkYV9ncnRsLCBjaHJvbW8gPT0gIk5DXzA1NTk1OS4xIiksIAogICAgICAgICAgICAgICAgICAgICBtYXBwaW5nID0gYWVzKHggPSBwb3NfY3VtLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gYWJzX2RpZmYpKSArCiAgZ2VvbV9wb2ludChhbHBoYSA9IDAuNzUsIHNpemUgPSAwLjUsIGNvbG9yID0gIiMyNDJiMzUiKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGxhYmVsID0gbXhnX2F4aXNfc2V0JGNocm9tbywgCiAgICAgICAgICAgICAgICAgICAgIGJyZWFrcyA9IG14Z19heGlzX3NldCRjZW50ZXIpICsKICBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gYygwLDApLCAKICAgICAgICAgICAgICAgICAgICAgbGltaXRzID0gYygwLjE1LCAxLjA1KSkgKwogIGxhYnMoeCA9IE5VTEwsIAogICAgICAgeSA9ICJBYnNvbHV0ZSBEaWZmZXJlbmNlIGluIEFsbGVsZSBGcmVxdWVuY3kiLCAKICAgICAgIHRpdGxlID0gIk1pZC1BdGxhbnRpYyBBbmFkcm9tb3VzIHZzIEdyZWF0IExha2VzIExhbmRsb2NrZWQgQWxld2lmZSIsIAogICAgICAgc3VidGl0bGUgPSAiQ2hyb21vc29tZSAzIikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwKICAgICAgICBwYW5lbC5ncmlkLm1ham9yLnggPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgcGFuZWwuZ3JpZC5taW5vci54ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfbWFya2Rvd24oKSwKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2anVzdCA9IDAuNSkpCm14Z19jaHIzX3Bsb3QKCm14Z19jaHIxMF9wbG90IDwtIGdncGxvdChkYXRhID0gZmlsdGVyKG1pZGFfZ3J0bCwgY2hyb21vID09ICJOQ18wNTU5NjYuMSIpLCAKICAgICAgICAgICAgICAgICAgICAgbWFwcGluZyA9IGFlcyh4ID0gcG9zX2N1bSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IGFic19kaWZmKSkgKwogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjc1LCBzaXplID0gMC41LCBjb2xvciA9ICIjMjQyYjM1IikgKwogIHNjYWxlX3hfY29udGludW91cyhsYWJlbCA9IG14Z19heGlzX3NldCRjaHJvbW8sIAogICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBteGdfYXhpc19zZXQkY2VudGVyKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGMoMCwwKSwgCiAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoMC4xNSwgMS4wNSkpICsKICBsYWJzKHggPSBOVUxMLCAKICAgICAgIHkgPSAiQWJzb2x1dGUgRGlmZmVyZW5jZSBpbiBBbGxlbGUgRnJlcXVlbmN5IiwgCiAgICAgICB0aXRsZSA9ICJNaWQtQXRsYW50aWMgQW5hZHJvbW91cyB2cyBHcmVhdCBMYWtlcyBMYW5kbG9ja2VkIEFsZXdpZmUiLCAKICAgICAgIHN1YnRpdGxlID0gIkNocm9tb3NvbWUgMTAiKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLAogICAgICAgIHBhbmVsLmdyaWQubWFqb3IueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBwYW5lbC5ncmlkLm1pbm9yLnggPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF9tYXJrZG93bigpLAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gOCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZqdXN0ID0gMC41KSkKbXhnX2NocjEwX3Bsb3QKCm14Z19jaHIxMl9wbG90IDwtIGdncGxvdChkYXRhID0gZmlsdGVyKG1pZGFfZ3J0bCwgY2hyb21vID09ICJOQ18wNTU5NjguMSIpLCAKICAgICAgICAgICAgICAgICAgICAgbWFwcGluZyA9IGFlcyh4ID0gcG9zX2N1bSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IGFic19kaWZmKSkgKwogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjc1LCBzaXplID0gMC41LCBjb2xvciA9ICIjMjQyYjM1IikgKwogIHNjYWxlX3hfY29udGludW91cyhsYWJlbCA9IG14Z19heGlzX3NldCRjaHJvbW8sIAogICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBteGdfYXhpc19zZXQkY2VudGVyKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGMoMCwwKSwgCiAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoMC4xNSwgMS4wNSkpICsKICBsYWJzKHggPSBOVUxMLCAKICAgICAgIHkgPSAiQWJzb2x1dGUgRGlmZmVyZW5jZSBpbiBBbGxlbGUgRnJlcXVlbmN5IiwgCiAgICAgICB0aXRsZSA9ICJNaWQtQXRsYW50aWMgQW5hZHJvbW91cyB2cyBHcmVhdCBMYWtlcyBMYW5kbG9ja2VkIEFsZXdpZmUiLCAKICAgICAgIHN1YnRpdGxlID0gIkNocm9tb3NvbWUgMTIiKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLAogICAgICAgIHBhbmVsLmdyaWQubWFqb3IueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBwYW5lbC5ncmlkLm1pbm9yLnggPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF9tYXJrZG93bigpLAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gOCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZqdXN0ID0gMC41KSkKbXhnX2NocjEyX3Bsb3QKCiMjIyBDaHJvbW9zb21lIDIgU3Bpa2UgUmVnaW9uICMjIwoKbXhnX3NwaWtlX3Bsb3QgPC0gbWlkYV9ncnRsICU+JQogIGZpbHRlcihjaHJvbW8gPT0gIk5DXzA1NTk1OC4xIikgJT4lCiAgZmlsdGVyKHBvc2l0aW9uID49IDE2NjAwMDAwKSAlPiUKICBmaWx0ZXIocG9zaXRpb24gPD0gMTcwMDAwMDApICU+JQogIGdncGxvdCguLAogICAgICAgICBtYXBwaW5nID0gYWVzKHggPSBwb3NpdGlvbiwgCiAgICAgICAgICAgICAgICAgICAgICAgeSA9IGFic19kaWZmKSkgKwogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjc1LCBjb2xvciA9ICIjODY5Y2E4Iiwgc2l6ZSA9IDIpICsKICBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gYygwLDApLCAKICAgICAgICAgICAgICAgICAgICAgbGltaXRzID0gYygwLjE1LCAxLjA1KSkgKwogIGxhYnMoeCA9ICJQb3NpdGlvbiIsIAogICAgICAgeSA9ICJBYnNvbHV0ZSBEaWZmZXJlbmNlIGluIEFsbGVsZSBGcmVxdWVuY3kiLCAKICAgICAgIHRpdGxlID0gIk1pZC1BdGxhbnRpYyBBbmFkcm9tb3VzIHZzIEdyZWF0IExha2VzIExhbmRsb2NrZWQgQWxld2lmZSBDaHJvbW9zb21lIDIiLCAKICAgICAgIHN1YnRpdGxlID0gIjE2NjAwMDAwLi4xNzAwMDAwMCIpICsKICB0aGVtZV9idygpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsCiAgICAgICAgcGFuZWwuZ3JpZC5tYWpvci54ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIHBhbmVsLmdyaWQubWlub3IueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X21hcmtkb3duKCksCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSA4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmp1c3QgPSAwLjUpKQpgYGAKTm9ydGhlcm4gQXRsYW50aWMgdmVyc3VzIHRoZSBGaW5nZXIgTGFrZXMgUG9wdWxhdGlvbnMKYGBge3Igbm9ydGh4ZmluZ2VyX3Bsb3QsIGVjaG8gPSBGQUxTRX0KbnhmX3Bsb3QgPC0gZ2dwbG90KGRhdGEgPSBuYXRsYV9maW5sLAogICAgICAgICAgICAgICAgICAgbWFwcGluZyA9IGFlcyh4ID0gcG9zX2N1bSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IGFic19kaWZmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvciA9IGFzX2ZhY3RvcihjaHJvbW8pKSkgKwogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjc1LCBzaXplID0gMSkgKwogIHNjYWxlX3hfY29udGludW91cyhsYWJlbCA9IG54Zl9heGlzX3NldCRjaHJvbW8sCiAgICAgICAgICAgICAgICAgICAgIGJyZWFrcyA9IG54Zl9heGlzX3NldCRjZW50ZXIpICsKICBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gYygwLDApLAogICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKDAuMTUsIDEuMDUpKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IHJlcChjKCIjMjQyYjM1IiwgIiM4NjljYTgiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXF1ZShsZW5ndGgobnhmX2F4aXNfc2V0JGNocm9tbykpKSkgKwogIGxhYnMoeCA9IE5VTEwsCiAgICAgICB5ID0gIkFic29sdXRlIERpZmZlcmVuY2UgaW4gQWxsZWxlIEZyZXF1ZW5jeSIsCiAgICAgICB0aXRsZSA9ICJOLiBBdGxhbnRpYyBBbmFkcm9tb3VzIHZzIEZpbmdlciBMYWtlcyBMYW5kbG9ja2VkIEFsZXdpZmUiKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLAogICAgICAgIHBhbmVsLmdyaWQubWFqb3IueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBwYW5lbC5ncmlkLm1pbm9yLnggPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF9tYXJrZG93bigpLAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gOCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZqdXN0ID0gMC41KSkKbnhmX3Bsb3QKCiMjIyBDaHJvbW9zb21lcyBvZiBJbnRlcmVzdCAjIyMKbnhmX2NocjFfcGxvdCA8LSBnZ3Bsb3QoZGF0YSA9IGZpbHRlcihuYXRsYV9maW5sLCBjaHJvbW8gPT0gIk5DXzA1NTk1Ny4xIiksIAogICAgICAgICAgICAgICAgICAgICBtYXBwaW5nID0gYWVzKHggPSBwb3NfY3VtLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gYWJzX2RpZmYpKSArCiAgZ2VvbV9wb2ludChhbHBoYSA9IDAuNzUsIHNpemUgPSAwLjUsIGNvbG9yID0gIiMyNDJiMzUiKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGxhYmVsID0gbnhmX2F4aXNfc2V0JGNocm9tbywgCiAgICAgICAgICAgICAgICAgICAgIGJyZWFrcyA9IG54Zl9heGlzX3NldCRjZW50ZXIpICsKICBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gYygwLDApLCAKICAgICAgICAgICAgICAgICAgICAgbGltaXRzID0gYygwLjE1LCAxLjA1KSkgKwogIGxhYnMoeCA9IE5VTEwsIAogICAgICAgeSA9ICJBYnNvbHV0ZSBEaWZmZXJlbmNlIGluIEFsbGVsZSBGcmVxdWVuY3kiLCAKICAgICAgIHRpdGxlID0gIk4uIEF0bGFudGljIEFuYWRyb21vdXMgdnMgRmluZ2VyIExha2VzIExhbmRsb2NrZWQgQWxld2lmZSIsIAogICAgICAgc3VidGl0bGUgPSAiQ2hyb21vc29tZSAxIikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwKICAgICAgICBwYW5lbC5ncmlkLm1ham9yLnggPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgcGFuZWwuZ3JpZC5taW5vci54ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfbWFya2Rvd24oKSwKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2anVzdCA9IDAuNSkpCm54Zl9jaHIxX3Bsb3QKCm54Zl9jaHIyX3Bsb3QgPC0gZ2dwbG90KGRhdGEgPSBmaWx0ZXIobmF0bGFfZmlubCwgY2hyb21vID09ICJOQ18wNTU5NTguMSIpLCAKICAgICAgICAgICAgICAgICAgICAgbWFwcGluZyA9IGFlcyh4ID0gcG9zX2N1bSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IGFic19kaWZmKSkgKwogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjc1LCBzaXplID0gMC41LCBjb2xvciA9ICIjODY5Y2E4IikgKwogIHNjYWxlX3hfY29udGludW91cyhsYWJlbCA9IG54Zl9heGlzX3NldCRjaHJvbW8sIAogICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBueGZfYXhpc19zZXQkY2VudGVyKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGMoMCwwKSwgCiAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoMC4xNSwgMS4wNSkpICsKICBsYWJzKHggPSBOVUxMLCAKICAgICAgIHkgPSAiQWJzb2x1dGUgRGlmZmVyZW5jZSBpbiBBbGxlbGUgRnJlcXVlbmN5IiwgCiAgICAgICB0aXRsZSA9ICJOLiBBdGxhbnRpYyBBbmFkcm9tb3VzIHZzIEZpbmdlciBMYWtlcyBMYW5kbG9ja2VkIEFsZXdpZmUiLCAKICAgICAgIHN1YnRpdGxlID0gIkNocm9tb3NvbWUgMiIpICsKICB0aGVtZV9idygpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsCiAgICAgICAgcGFuZWwuZ3JpZC5tYWpvci54ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIHBhbmVsLmdyaWQubWlub3IueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X21hcmtkb3duKCksCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSA4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmp1c3QgPSAwLjUpKQpueGZfY2hyMl9wbG90CgpueGZfY2hyM19wbG90IDwtIGdncGxvdChkYXRhID0gZmlsdGVyKG5hdGxhX2ZpbmwsIGNocm9tbyA9PSAiTkNfMDU1OTU5LjEiKSwgCiAgICAgICAgICAgICAgICAgICAgIG1hcHBpbmcgPSBhZXMoeCA9IHBvc19jdW0sIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSBhYnNfZGlmZikpICsKICBnZW9tX3BvaW50KGFscGhhID0gMC43NSwgc2l6ZSA9IDAuNSwgY29sb3IgPSAiIzI0MmIzNSIpICsKICBzY2FsZV94X2NvbnRpbnVvdXMobGFiZWwgPSBueGZfYXhpc19zZXQkY2hyb21vLCAKICAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gbnhmX2F4aXNfc2V0JGNlbnRlcikgKwogIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBjKDAsMCksIAogICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKDAuMTUsIDEuMDUpKSArCiAgbGFicyh4ID0gTlVMTCwgCiAgICAgICB5ID0gIkFic29sdXRlIERpZmZlcmVuY2UgaW4gQWxsZWxlIEZyZXF1ZW5jeSIsIAogICAgICAgdGl0bGUgPSAiTi4gQXRsYW50aWMgQW5hZHJvbW91cyB2cyBGaW5nZXIgTGFrZXMgTGFuZGxvY2tlZCBBbGV3aWZlIiwgCiAgICAgICBzdWJ0aXRsZSA9ICJDaHJvbW9zb21lIDMiKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLAogICAgICAgIHBhbmVsLmdyaWQubWFqb3IueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBwYW5lbC5ncmlkLm1pbm9yLnggPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF9tYXJrZG93bigpLAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gOCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZqdXN0ID0gMC41KSkKbnhmX2NocjNfcGxvdAoKbnhmX2NocjEwX3Bsb3QgPC0gZ2dwbG90KGRhdGEgPSBmaWx0ZXIobmF0bGFfZmlubCwgY2hyb21vID09ICJOQ18wNTU5NjYuMSIpLCAKICAgICAgICAgICAgICAgICAgICAgbWFwcGluZyA9IGFlcyh4ID0gcG9zX2N1bSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IGFic19kaWZmKSkgKwogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjc1LCBzaXplID0gMC41LCBjb2xvciA9ICIjMjQyYjM1IikgKwogIHNjYWxlX3hfY29udGludW91cyhsYWJlbCA9IG54Zl9heGlzX3NldCRjaHJvbW8sIAogICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBueGZfYXhpc19zZXQkY2VudGVyKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGMoMCwwKSwgCiAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoMC4xNSwgMS4wNSkpICsKICBsYWJzKHggPSBOVUxMLCAKICAgICAgIHkgPSAiQWJzb2x1dGUgRGlmZmVyZW5jZSBpbiBBbGxlbGUgRnJlcXVlbmN5IiwgCiAgICAgICB0aXRsZSA9ICJOLiBBdGxhbnRpYyBBbmFkcm9tb3VzIHZzIEZpbmdlciBMYWtlcyBMYW5kbG9ja2VkIEFsZXdpZmUiLCAKICAgICAgIHN1YnRpdGxlID0gIkNocm9tb3NvbWUgMTAiKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLAogICAgICAgIHBhbmVsLmdyaWQubWFqb3IueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBwYW5lbC5ncmlkLm1pbm9yLnggPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF9tYXJrZG93bigpLAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gOCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZqdXN0ID0gMC41KSkKbnhmX2NocjEwX3Bsb3QKCm54Zl9jaHIxMl9wbG90IDwtIGdncGxvdChkYXRhID0gZmlsdGVyKG5hdGxhX2ZpbmwsIGNocm9tbyA9PSAiTkNfMDU1OTY4LjEiKSwgCiAgICAgICAgICAgICAgICAgICAgIG1hcHBpbmcgPSBhZXMoeCA9IHBvc19jdW0sIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSBhYnNfZGlmZikpICsKICBnZW9tX3BvaW50KGFscGhhID0gMC43NSwgc2l6ZSA9IDAuNSwgY29sb3IgPSAiIzI0MmIzNSIpICsKICBzY2FsZV94X2NvbnRpbnVvdXMobGFiZWwgPSBueGZfYXhpc19zZXQkY2hyb21vLCAKICAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gbnhmX2F4aXNfc2V0JGNlbnRlcikgKwogIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBjKDAsMCksIAogICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKDAuMTUsIDEuMDUpKSArCiAgbGFicyh4ID0gTlVMTCwgCiAgICAgICB5ID0gIkFic29sdXRlIERpZmZlcmVuY2UgaW4gQWxsZWxlIEZyZXF1ZW5jeSIsIAogICAgICAgdGl0bGUgPSAiTi4gQXRsYW50aWMgQW5hZHJvbW91cyB2cyBGaW5nZXIgTGFrZXMgTGFuZGxvY2tlZCBBbGV3aWZlIiwgCiAgICAgICBzdWJ0aXRsZSA9ICJDaHJvbW9zb21lIDEyIikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwKICAgICAgICBwYW5lbC5ncmlkLm1ham9yLnggPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgcGFuZWwuZ3JpZC5taW5vci54ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfbWFya2Rvd24oKSwKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2anVzdCA9IDAuNSkpCm54Zl9jaHIxMl9wbG90CgojIyMgQ2hyb21vc29tZSAyIFNwaWtlIFJlZ2lvbiAjIyMKCm54Zl9zcGlrZV9wbG90IDwtIG5hdGxhX2ZpbmwgJT4lCiAgZmlsdGVyKGNocm9tbyA9PSAiTkNfMDU1OTU4LjEiKSAlPiUKICBmaWx0ZXIocG9zaXRpb24gPj0gMTY2MDAwMDApICU+JQogIGZpbHRlcihwb3NpdGlvbiA8PSAxNzAwMDAwMCkgJT4lCiAgZ2dwbG90KC4sCiAgICAgICAgIG1hcHBpbmcgPSBhZXMoeCA9IHBvc2l0aW9uLCAKICAgICAgICAgICAgICAgICAgICAgICB5ID0gYWJzX2RpZmYpKSArCiAgZ2VvbV9wb2ludChhbHBoYSA9IDAuNzUsIGNvbG9yID0gIiM4NjljYTgiLCBzaXplID0gMikgKwogIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBjKDAsMCksIAogICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKDAuMTUsIDEuMDUpKSArCiAgbGFicyh4ID0gIlBvc2l0aW9uIiwgCiAgICAgICB5ID0gIkFic29sdXRlIERpZmZlcmVuY2UgaW4gQWxsZWxlIEZyZXF1ZW5jeSIsIAogICAgICAgdGl0bGUgPSAiTi4gQXRsYW50aWMgQW5hZHJvbW91cyB2cyBGaW5nZXIgTGFrZXMgTGFuZGxvY2tlZCBBbGV3aWZlIENocm9tb3NvbWUgMiIsIAogICAgICAgc3VidGl0bGUgPSAiMTY2MDAwMDAuLjE3MDAwMDAwIikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwKICAgICAgICBwYW5lbC5ncmlkLm1ham9yLnggPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgcGFuZWwuZ3JpZC5taW5vci54ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfbWFya2Rvd24oKSwKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2anVzdCA9IDAuNSkpCmBgYAoKTWlkLUF0bGFudGljIHZlcnN1cyB0aGUgRmluZ2VyIExha2VzIFBvcHVsYXRpb25zCmBgYHtyIG1pZHhmaW5nZXJfcGxvdCwgZWNobyA9IEZBTFNFfQpteGZfcGxvdCA8LSBnZ3Bsb3QoZGF0YSA9IG1pZGFfZmlubCwKICAgICAgICAgICAgICAgICAgIG1hcHBpbmcgPSBhZXMoeCA9IHBvc19jdW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSBhYnNfZGlmZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IgPSBhc19mYWN0b3IoY2hyb21vKSkpICsKICBnZW9tX3BvaW50KGFscGhhID0gMC43NSwgc2l6ZSA9IDEpICsKICBzY2FsZV94X2NvbnRpbnVvdXMobGFiZWwgPSBteGZfYXhpc19zZXQkY2hyb21vLAogICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBteGZfYXhpc19zZXQkY2VudGVyKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGMoMCwwKSwKICAgICAgICAgICAgICAgICAgICAgbGltaXRzID0gYygwLjE1LCAxLjA1KSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSByZXAoYygiIzI0MmIzNSIsICIjODY5Y2E4IiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmlxdWUobGVuZ3RoKG14Zl9heGlzX3NldCRjaHJvbW8pKSkpICsKICBsYWJzKHggPSBOVUxMLAogICAgICAgeSA9ICJBYnNvbHV0ZSBEaWZmZXJlbmNlIGluIEFsbGVsZSBGcmVxdWVuY3kiLAogICAgICAgdGl0bGUgPSAiTWlkLUF0bGFudGljIEFuYWRyb21vdXMgdnMgRmluZ2VyIExha2VzIExhbmRsb2NrZWQgQWxld2lmZSIpICsKICB0aGVtZV9idygpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsCiAgICAgICAgcGFuZWwuZ3JpZC5tYWpvci54ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIHBhbmVsLmdyaWQubWlub3IueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X21hcmtkb3duKCksCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSA4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmp1c3QgPSAwLjUpKQpteGZfcGxvdAoKIyMjIENocm9tb3NvbWVzIG9mIEludGVyZXN0ICMjIwpteGZfY2hyMV9wbG90IDwtIGdncGxvdChkYXRhID0gZmlsdGVyKG1pZGFfZmlubCwgY2hyb21vID09ICJOQ18wNTU5NTcuMSIpLCAKICAgICAgICAgICAgICAgICAgICAgbWFwcGluZyA9IGFlcyh4ID0gcG9zX2N1bSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IGFic19kaWZmKSkgKwogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjc1LCBzaXplID0gMC41LCBjb2xvciA9ICIjMjQyYjM1IikgKwogIHNjYWxlX3hfY29udGludW91cyhsYWJlbCA9IG14Zl9heGlzX3NldCRjaHJvbW8sIAogICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBteGZfYXhpc19zZXQkY2VudGVyKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGMoMCwwKSwgCiAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoMC4xNSwgMS4wNSkpICsKICBsYWJzKHggPSBOVUxMLCAKICAgICAgIHkgPSAiQWJzb2x1dGUgRGlmZmVyZW5jZSBpbiBBbGxlbGUgRnJlcXVlbmN5IiwgCiAgICAgICB0aXRsZSA9ICJNaWQtQXRsYW50aWMgQW5hZHJvbW91cyB2cyBGaW5nZXIgTGFrZXMgTGFuZGxvY2tlZCBBbGV3aWZlIiwgCiAgICAgICBzdWJ0aXRsZSA9ICJDaHJvbW9zb21lIDEiKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLAogICAgICAgIHBhbmVsLmdyaWQubWFqb3IueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBwYW5lbC5ncmlkLm1pbm9yLnggPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF9tYXJrZG93bigpLAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gOCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZqdXN0ID0gMC41KSkKbXhmX2NocjFfcGxvdAoKbXhmX2NocjJfcGxvdCA8LSBnZ3Bsb3QoZGF0YSA9IGZpbHRlcihtaWRhX2ZpbmwsIGNocm9tbyA9PSAiTkNfMDU1OTU4LjEiKSwgCiAgICAgICAgICAgICAgICAgICAgIG1hcHBpbmcgPSBhZXMoeCA9IHBvc19jdW0sIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSBhYnNfZGlmZikpICsKICBnZW9tX3BvaW50KGFscGhhID0gMC43NSwgc2l6ZSA9IDAuNSwgY29sb3IgPSAiIzg2OWNhOCIpICsKICBzY2FsZV94X2NvbnRpbnVvdXMobGFiZWwgPSBteGZfYXhpc19zZXQkY2hyb21vLCAKICAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gbXhmX2F4aXNfc2V0JGNlbnRlcikgKwogIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBjKDAsMCksIAogICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKDAuMTUsIDEuMDUpKSArCiAgbGFicyh4ID0gTlVMTCwgCiAgICAgICB5ID0gIkFic29sdXRlIERpZmZlcmVuY2UgaW4gQWxsZWxlIEZyZXF1ZW5jeSIsIAogICAgICAgdGl0bGUgPSAiTWlkLUF0bGFudGljIEFuYWRyb21vdXMgdnMgRmluZ2VyIExha2VzIExhbmRsb2NrZWQgQWxld2lmZSIsIAogICAgICAgc3VidGl0bGUgPSAiQ2hyb21vc29tZSAyIikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwKICAgICAgICBwYW5lbC5ncmlkLm1ham9yLnggPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgcGFuZWwuZ3JpZC5taW5vci54ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfbWFya2Rvd24oKSwKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2anVzdCA9IDAuNSkpCm14Zl9jaHIyX3Bsb3QKCm14Zl9jaHIzX3Bsb3QgPC0gZ2dwbG90KGRhdGEgPSBmaWx0ZXIobWlkYV9maW5sLCBjaHJvbW8gPT0gIk5DXzA1NTk1OS4xIiksIAogICAgICAgICAgICAgICAgICAgICBtYXBwaW5nID0gYWVzKHggPSBwb3NfY3VtLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gYWJzX2RpZmYpKSArCiAgZ2VvbV9wb2ludChhbHBoYSA9IDAuNzUsIHNpemUgPSAwLjUsIGNvbG9yID0gIiMyNDJiMzUiKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGxhYmVsID0gbXhmX2F4aXNfc2V0JGNocm9tbywgCiAgICAgICAgICAgICAgICAgICAgIGJyZWFrcyA9IG14Zl9heGlzX3NldCRjZW50ZXIpICsKICBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gYygwLDApLCAKICAgICAgICAgICAgICAgICAgICAgbGltaXRzID0gYygwLjE1LCAxLjA1KSkgKwogIGxhYnMoeCA9IE5VTEwsIAogICAgICAgeSA9ICJBYnNvbHV0ZSBEaWZmZXJlbmNlIGluIEFsbGVsZSBGcmVxdWVuY3kiLCAKICAgICAgIHRpdGxlID0gIk1pZC1BdGxhbnRpYyBBbmFkcm9tb3VzIHZzIEZpbmdlciBMYWtlcyBMYW5kbG9ja2VkIEFsZXdpZmUiLCAKICAgICAgIHN1YnRpdGxlID0gIkNocm9tb3NvbWUgMyIpICsKICB0aGVtZV9idygpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsCiAgICAgICAgcGFuZWwuZ3JpZC5tYWpvci54ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIHBhbmVsLmdyaWQubWlub3IueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X21hcmtkb3duKCksCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSA4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmp1c3QgPSAwLjUpKQpteGZfY2hyM19wbG90CgpteGZfY2hyMTBfcGxvdCA8LSBnZ3Bsb3QoZGF0YSA9IGZpbHRlcihtaWRhX2ZpbmwsIGNocm9tbyA9PSAiTkNfMDU1OTY2LjEiKSwgCiAgICAgICAgICAgICAgICAgICAgIG1hcHBpbmcgPSBhZXMoeCA9IHBvc19jdW0sIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSBhYnNfZGlmZikpICsKICBnZW9tX3BvaW50KGFscGhhID0gMC43NSwgc2l6ZSA9IDAuNSwgY29sb3IgPSAiIzI0MmIzNSIpICsKICBzY2FsZV94X2NvbnRpbnVvdXMobGFiZWwgPSBteGZfYXhpc19zZXQkY2hyb21vLCAKICAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gbXhmX2F4aXNfc2V0JGNlbnRlcikgKwogIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBjKDAsMCksIAogICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKDAuMTUsIDEuMDUpKSArCiAgbGFicyh4ID0gTlVMTCwgCiAgICAgICB5ID0gIkFic29sdXRlIERpZmZlcmVuY2UgaW4gQWxsZWxlIEZyZXF1ZW5jeSIsIAogICAgICAgdGl0bGUgPSAiTWlkLUF0bGFudGljIEFuYWRyb21vdXMgdnMgRmluZ2VyIExha2VzIExhbmRsb2NrZWQgQWxld2lmZSIsIAogICAgICAgc3VidGl0bGUgPSAiQ2hyb21vc29tZSAxMCIpICsKICB0aGVtZV9idygpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsCiAgICAgICAgcGFuZWwuZ3JpZC5tYWpvci54ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIHBhbmVsLmdyaWQubWlub3IueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X21hcmtkb3duKCksCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSA4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmp1c3QgPSAwLjUpKQpteGZfY2hyMTBfcGxvdAoKbXhmX2NocjEyX3Bsb3QgPC0gZ2dwbG90KGRhdGEgPSBmaWx0ZXIobWlkYV9maW5sLCBjaHJvbW8gPT0gIk5DXzA1NTk2OC4xIiksIAogICAgICAgICAgICAgICAgICAgICBtYXBwaW5nID0gYWVzKHggPSBwb3NfY3VtLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gYWJzX2RpZmYpKSArCiAgZ2VvbV9wb2ludChhbHBoYSA9IDAuNzUsIHNpemUgPSAwLjUsIGNvbG9yID0gIiMyNDJiMzUiKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGxhYmVsID0gbXhmX2F4aXNfc2V0JGNocm9tbywgCiAgICAgICAgICAgICAgICAgICAgIGJyZWFrcyA9IG14Zl9heGlzX3NldCRjZW50ZXIpICsKICBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gYygwLDApLCAKICAgICAgICAgICAgICAgICAgICAgbGltaXRzID0gYygwLjE1LCAxLjA1KSkgKwogIGxhYnMoeCA9IE5VTEwsIAogICAgICAgeSA9ICJBYnNvbHV0ZSBEaWZmZXJlbmNlIGluIEFsbGVsZSBGcmVxdWVuY3kiLCAKICAgICAgIHRpdGxlID0gIk1pZC1BdGxhbnRpYyBBbmFkcm9tb3VzIHZzIEZpbmdlciBMYWtlcyBMYW5kbG9ja2VkIEFsZXdpZmUiLCAKICAgICAgIHN1YnRpdGxlID0gIkNocm9tb3NvbWUgMTIiKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLAogICAgICAgIHBhbmVsLmdyaWQubWFqb3IueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBwYW5lbC5ncmlkLm1pbm9yLnggPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF9tYXJrZG93bigpLAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gOCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZqdXN0ID0gMC41KSkKbXhmX2NocjEyX3Bsb3QKCiMjIyBDaHJvbW9zb21lIDIgU3Bpa2UgUmVnaW9uICMjIwoKbXhmX3NwaWtlX3Bsb3QgPC0gbWlkYV9maW5sICU+JQogIGZpbHRlcihjaHJvbW8gPT0gIk5DXzA1NTk1OC4xIikgJT4lCiAgZmlsdGVyKHBvc2l0aW9uID49IDE2NjAwMDAwKSAlPiUKICBmaWx0ZXIocG9zaXRpb24gPD0gMTcwMDAwMDApICU+JQogIGdncGxvdCguLAogICAgICAgICBtYXBwaW5nID0gYWVzKHggPSBwb3NpdGlvbiwgCiAgICAgICAgICAgICAgICAgICAgICAgeSA9IGFic19kaWZmKSkgKwogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjc1LCBjb2xvciA9ICIjODY5Y2E4Iiwgc2l6ZSA9IDIpICsKICBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gYygwLDApLCAKICAgICAgICAgICAgICAgICAgICAgbGltaXRzID0gYygwLjE1LCAxLjA1KSkgKwogIGxhYnMoeCA9ICJQb3NpdGlvbiIsIAogICAgICAgeSA9ICJBYnNvbHV0ZSBEaWZmZXJlbmNlIGluIEFsbGVsZSBGcmVxdWVuY3kiLCAKICAgICAgIHRpdGxlID0gIk1pZC1BdGxhbnRpYyBBbmFkcm9tb3VzIHZzIEZpbmdlciBMYWtlcyBMYW5kbG9ja2VkIEFsZXdpZmUgQ2hyb21vc29tZSAyIiwgCiAgICAgICBzdWJ0aXRsZSA9ICIxNjYwMDAwMC4uMTcwMDAwMDAiKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLAogICAgICAgIHBhbmVsLmdyaWQubWFqb3IueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBwYW5lbC5ncmlkLm1pbm9yLnggPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF9tYXJrZG93bigpLAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gOCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZqdXN0ID0gMC41KSkKYGBgCgpUaGVyZSBpc24ndCBhbnl0aGluZyBwb3BwaW5nIHVwIG90aGVyIHRoYW4gdGhlIGJpZyBzcGlrZSBvbiBjaHJvbW9zb21lIDIsIGV2ZW4gdGhvdWdoIHdlIHNlZSBzb21lIHNwaWtlcyBhYm92ZSAwLjI1IGluIEZzdCBvbiBzb21lIG9mIHRoZSBvdGhlciBjaHJvbW9zb21lcy4gTGV0J3MganVzdCBjb21wYXJlIHRoZSBzcGlrZSByZWdpb25zIGZvciBjaHJvbW9zb21lIDIuCgpgYGB7ciBzcGlrZV9wbG90cywgZWNobyA9IEZBTFNFfQpueG1fc3Bpa2VfcGxvdApueGdfc3Bpa2VfcGxvdApteGdfc3Bpa2VfcGxvdApueGZfc3Bpa2VfcGxvdApteGZfc3Bpa2VfcGxvdApgYGAKU3VjY2VzcyEgV2UncmUgc2VlaW5nIHRoZSBzYW1lIHNwaWtlIGluIGFic29sdXRlIGRpZmZlcmVuY2Ugb2YgYWxsZWxlIGZyZXF1ZW5jeSBpbiB0aGUgTWlkLUF0bGFudGljIHBvcHVsYXRpb25zIHdoZW4gY29tcGFyZWQgdGhlIGVpdGhlciBHcmVhdCBMYWtlcyBvciBGaW5nZXIgTGFrZXMgdGhhdCB3ZSBzZWUgaW4gdGhlIE5vcnRoZXJuIEF0bGFudGljIHZzIE1pZC1BdGxhbnRpYyBjb21wYXJpc29uLiBCZWNhdXNlIHRoZSBhbGxlbGUgZnJlcXVlbmNpZXMgYXJlbid0IHZlcnkgZGlmZmVyZW50IGJldHdlZW4gdGhlIE5vcnRoZXJuIEF0bGFudGljIGFuZCBHcmVhdC9GaW5nZXIgTGFrZXMgYXQgdGhhdCBoaWdobHkgdmFyaWFibGUgc2l0ZSwgaXQgbG9va3MgbGlrZSB0aGUgYWxld2lmZSBmcm9tIE5vcnRoZXJuIEF0bGFudGljIHBvcHVsYXRpb25zIChNaXJhbWljaGkgYW5kIFNhY28gUml2ZXIpIG1heSBoYXZlIGJlZW4gdGhlIHNvdXJjZSBwb3B1bGF0aW9uIGZvciB0aGUgR3JlYXQgTGFrZXMgYW5kIHRoZSBGaW5nZXIgTGFrZXMuIAoKVGVzdGluZyBvdXQgdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gR3JlYXQgTGFrZXMgYW5kIEZpbmdlciBMYWtlcywgd2hpY2ggZ3JvdXAgcHJldHR5IHN0cm9uZ2x5IHRvZ2V0aGVyIGluIFBDQS4gCmBgYHtyIGZpbmdlcnhncmVhdF90ZXN0LCBlY2hvID0gRkFMU0UsIGV2YWwgPSBGQUxTRX0KZmlubF9ncnRsIDwtIGlubmVyX2pvaW4oZmlubF9mcmVxcywgCiAgICAgICAgICAgICAgICAgICAgICAgICBncnRsX2ZyZXFzLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGJ5ID0gYygiY2hyb21vIiwgInBvc2l0aW9uIiksIAogICAgICAgICAgICAgICAgICAgICAgICAgc3VmZml4ID0gYygiX2YiLCAiX2ciKSkgJT4lCiAgbXV0YXRlKGF2ZV9mcmVxID0gKHVua25vd25FTV9mICsgdW5rbm93bkVNX2cpIC8gMiwgCiAgICAgICAgIGFic19kaWZmID0gYWJzKHVua25vd25FTV9mIC0gdW5rbm93bkVNX2cpKQoKZnhnX2NoZWNrIDwtIGdncGxvdChkYXRhID0gZmlubF9ncnRsLCAKICAgICAgICAgICAgICAgICAgICBtYXBwaW5nID0gYWVzKGF2ZV9mcmVxLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSBhYnNfZGlmZikpICsKICBnZW9tX2hleChiaW53aWR0aCA9IDAuMDAxKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzX2MoKQpmeGdfY2hlY2sKCmZpbmxfZ3J0bCA8LSBmaW5sX2dydGwgJT4lCiAgZmlsdGVyKGFic19kaWZmID4gMC4xNSkKCmRhdGFfY3VtIDwtIGZpbmxfZ3J0bCAlPiUKICBncm91cF9ieShjaHJvbW8pICU+JQogIHN1bW1hcmlzZShtYXhfcG9zID0gbWF4KHBvc2l0aW9uKSkgJT4lCiAgbXV0YXRlKHBvc19hZGQgPSBsYWcoY3Vtc3VtKG1heF9wb3MpLCBkZWZhdWx0ID0gMCkpICU+JQogIHNlbGVjdChjaHJvbW8sIHBvc19hZGQpCmZpbmxfZ3J0bCA8LSBmaW5sX2dydGwgJT4lCiAgaW5uZXJfam9pbihkYXRhX2N1bSwgYnkgPSAiY2hyb21vIikgJT4lCiAgbXV0YXRlKHBvc19jdW0gPSBwb3NpdGlvbiArIHBvc19hZGQpCmZ4Z19heGlzX3NldCA8LSBmaW5sX2dydGwgJT4lCiAgZ3JvdXBfYnkoY2hyb21vKSAlPiUKICBzdW1tYXJpc2UoY2VudGVyID0gbWVhbihwb3NfY3VtKSkKCmZ4Z19wbG90IDwtIGdncGxvdChkYXRhID0gZmlubF9ncnRsLAogICAgICAgICAgICAgICAgICAgbWFwcGluZyA9IGFlcyh4ID0gcG9zX2N1bSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IGFic19kaWZmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvciA9IGFzX2ZhY3RvcihjaHJvbW8pKSkgKwogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjc1LCBzaXplID0gMSkgKwogIHNjYWxlX3hfY29udGludW91cyhsYWJlbCA9IGZ4Z19heGlzX3NldCRjaHJvbW8sCiAgICAgICAgICAgICAgICAgICAgIGJyZWFrcyA9IGZ4Z19heGlzX3NldCRjZW50ZXIpICsKICBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gYygwLDApLAogICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKDAuMTUsIDEuMDUpKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IHJlcChjKCIjMjQyYjM1IiwgIiM4NjljYTgiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXF1ZShsZW5ndGgoZnhnX2F4aXNfc2V0JGNocm9tbykpKSkgKwogIGxhYnMoeCA9IE5VTEwsCiAgICAgICB5ID0gIkFic29sdXRlIERpZmZlcmVuY2UgaW4gQWxsZWxlIEZyZXF1ZW5jeSIsCiAgICAgICB0aXRsZSA9ICJGaW5nZXIgTGFrZXMgdnMgR3JlYXQgTGFrZXMgTGFuZGxvY2tlZCBBbGV3aWZlIikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwKICAgICAgICBwYW5lbC5ncmlkLm1ham9yLnggPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgcGFuZWwuZ3JpZC5taW5vci54ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfbWFya2Rvd24oKSwKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2anVzdCA9IDAuNSkpCmZ4Z19wbG90CgojIyMgQ2hyb21vc29tZSAyIFNwaWtlIFJlZ2lvbiAjIyMKCmZ4Z19zcGlrZV9wbG90IDwtIGZpbmxfZ3J0bCAlPiUKICBmaWx0ZXIoY2hyb21vID09ICJOQ18wNTU5NTguMSIpICU+JQogIGZpbHRlcihwb3NpdGlvbiA+PSAxNjYwMDAwMCkgJT4lCiAgZmlsdGVyKHBvc2l0aW9uIDw9IDE3MDAwMDAwKSAlPiUKICBnZ3Bsb3QoLiwKICAgICAgICAgbWFwcGluZyA9IGFlcyh4ID0gcG9zaXRpb24sIAogICAgICAgICAgICAgICAgICAgICAgIHkgPSBhYnNfZGlmZikpICsKICBnZW9tX3BvaW50KGFscGhhID0gMC43NSwgY29sb3IgPSAiIzg2OWNhOCIsIHNpemUgPSAyKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGMoMCwwKSwgCiAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoMC4xNSwgMS4wNSkpICsKICBsYWJzKHggPSAiUG9zaXRpb24iLCAKICAgICAgIHkgPSAiQWJzb2x1dGUgRGlmZmVyZW5jZSBpbiBBbGxlbGUgRnJlcXVlbmN5IiwgCiAgICAgICB0aXRsZSA9ICJGaW5nZXIgTGFrZXMgdnMgR3JlYXQgTGFrZXMgTGFuZGxvY2tlZCBBbGV3aWZlIENocm9tb3NvbWUgMiIsIAogICAgICAgc3VidGl0bGUgPSAiMTY2MDAwMDAuLjE3MDAwMDAwIikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwKICAgICAgICBwYW5lbC5ncmlkLm1ham9yLnggPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgcGFuZWwuZ3JpZC5taW5vci54ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfbWFya2Rvd24oKSwKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2anVzdCA9IDAuNSkpCmZ4Z19zcGlrZV9wbG90CmBgYAoKYGBge3Igc2F2ZV9wbG90cywgZWNobyA9IEZBTFNFLCBldmFsID0gRkFMU0V9Cmdnc2F2ZSgiZmlndXJlcy9hbGxlbGUtZnJlcXMvbmF0bGEteC1maW5sLWNocm9tMi1zcGlrZS1hbGxlbGUtZnJlcXMucG5nIiwgCiAgICAgICBwbG90ID0gbnhmX3NwaWtlX3Bsb3QsIAogICAgICAgd2lkdGggPSAxMCwgCiAgICAgICBoZWlnaHQgPSA0KQpgYGAKCg==